updates rgblight implementation, makes non-timer stuff compatible with audio

pull/491/head
Jack Humbert 9 years ago
parent ad43d450ca
commit 57e08eb8ba

@ -25,9 +25,8 @@
/* Underlight configuration /* Underlight configuration
*/ */
#define ws2812_PORTREG PORTB #define RGB_DI_PIN B2
#define ws2812_DDRREG DDRB #define RGBLIGHT_TIMER
#define ws2812_pin 2
#define RGBLED_NUM 14 // Number of LEDs #define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17

@ -29,9 +29,8 @@
/* Underlight configuration /* Underlight configuration
*/ */
#define ws2812_PORTREG PORTD #define RGB_DI_PIN D7
#define ws2812_DDRREG DDRD #define RGBLIGHT_TIMER
#define ws2812_pin 7
#define RGBLED_NUM 14 // Number of LEDs #define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17

@ -69,13 +69,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Underlight configuration /* Underlight configuration
*/ */
#define ws2812_PORTREG PORTF #define RGB_DI_PIN F6
#define ws2812_DDRREG DDRF #define RGBLIGHT_TIMER
#define ws2812_pin 6 #define RGBLED_NUM 4 // Number of LEDs
#define RGBLED_NUM 4 // Number of LEDs #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_VAL_STEP 17
#define RGBLIGHT_VAL_STEP 17
/* /*
* Feature disable options * Feature disable options

@ -1,9 +1,8 @@
#include "../../config.h" #include "../../config.h"
/* WS2812B RGB Underglow LED */ /* WS2812B RGB Underglow LED */
#define ws2812_PORTREG PORTF #define RGB_DI_PIN F5 // Based on wiring depicted in ws2812_wiring.jpg
#define ws2812_DDRREG DDRF #define RGBLIGHT_TIMER
#define ws2812_pin PF5 // Based on wiring depicted in ws2812_wiring.jpg
#define RGBLED_NUM 16 // Number of LEDs. Change this to match your use case. #define RGBLED_NUM 16 // Number of LEDs. Change this to match your use case.
#define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_SAT_STEP 8

@ -69,9 +69,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
) )
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#define ws2812_PORTREG PORTD #define RGB_DI_PIN D2
#define ws2812_DDRREG DDRD #define RGBLIGHT_TIMER
#define ws2812_pin PD1
#define RGBLED_NUM 28 // Number of LEDs #define RGBLED_NUM 28 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17

@ -62,13 +62,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Underlight configuration /* Underlight configuration
*/ */
#define ws2812_PORTREG PORTE #define RGB_DI_PIN E2
#define ws2812_DDRREG DDRE #define RGBLIGHT_TIMER
#define ws2812_pin 2 #define RGBLED_NUM 20 // Number of LEDs
#define RGBLED_NUM 20 // Number of LEDs #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_VAL_STEP 17
#define RGBLIGHT_VAL_STEP 17
/* /*
* Feature disable options * Feature disable options

@ -10,12 +10,12 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400) CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6 AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

@ -6,4 +6,12 @@
#define LEADER_TIMEOUT 300 #define LEADER_TIMEOUT 300
#define BACKLIGHT_BREATHING #define BACKLIGHT_BREATHING
/* ws2812 RGB LED */
#define RGB_DI_PIN B1
#define RGBLIGHT_TIMER
#define RGBLED_NUM 8 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#endif #endif

@ -15,7 +15,7 @@ extern keymap_config_t keymap_config;
// The underscores don't mean anything - you can have a layer called STUFF or any other name. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them // Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers. // entirely and just use numbers.
#define _QWERTY 0 #define _QWERTY 10
#define _COLEMAK 1 #define _COLEMAK 1
#define _DVORAK 2 #define _DVORAK 2
#define _LOWER 3 #define _LOWER 3
@ -31,7 +31,15 @@ enum planck_keycodes {
LOWER, LOWER,
RAISE, RAISE,
BACKLIT, BACKLIT,
EXT_PLV EXT_PLV,
RGBLED_TOGGLE,
RGBLED_STEP_MODE,
RGBLED_INCREASE_HUE,
RGBLED_DECREASE_HUE,
RGBLED_INCREASE_SAT,
RGBLED_DECREASE_SAT,
RGBLED_INCREASE_VAL,
RGBLED_DECREASE_VAL,
}; };
// Fillers to make layering more clear // Fillers to make layering more clear
@ -39,14 +47,20 @@ enum planck_keycodes {
#define XXXXXXX KC_NO #define XXXXXXX KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = {
{KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL},
{KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL},
{KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL},
{KC_NO, KC_NO, KC_NO, KC_NO, RGBLED_TOGGLE, RGBLED_STEP_MODE, RGBLED_INCREASE_HUE, RGBLED_DECREASE_HUE, RGBLED_INCREASE_SAT, RGBLED_DECREASE_SAT, RGBLED_INCREASE_VAL, RGBLED_DECREASE_VAL}
},
/* Qwerty /* Qwerty
* ,-----------------------------------------------------------------------------------. ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " | * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | * | Shift| Z | X | C | V | B | N | M |, | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
@ -292,6 +306,57 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
break; break;
return false; return false;
case RGBLED_TOGGLE:
//led operations
if (record->event.pressed) {
rgblight_toggle();
}
return false;
break;
case RGBLED_INCREASE_HUE:
if (record->event.pressed) {
rgblight_increase_hue();
}
return false;
break;
case RGBLED_DECREASE_HUE:
if (record->event.pressed) {
rgblight_decrease_hue();
}
return false;
break;
case RGBLED_INCREASE_SAT:
if (record->event.pressed) {
rgblight_increase_sat();
}
return false;
break;
case RGBLED_DECREASE_SAT:
if (record->event.pressed) {
rgblight_decrease_sat();
}
return false;
break;
case RGBLED_INCREASE_VAL:
if (record->event.pressed) {
rgblight_increase_val();
}
return false;
break;
case RGBLED_DECREASE_VAL:
if (record->event.pressed) {
rgblight_decrease_val();
}
return false;
break;
case RGBLED_STEP_MODE:
if (record->event.pressed) {
rgblight_step();
}
return false;
break;
} }
return true; return true;
}; };

@ -60,9 +60,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
) )
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#define ws2812_PORTREG PORTD #define RGB_DI_PIN D1
#define ws2812_DDRREG DDRD #define RGBLIGHT_TIMER
#define ws2812_pin PD1
#define RGBLED_NUM 28 // Number of LEDs #define RGBLED_NUM 28 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17

@ -4,9 +4,8 @@
#include "../../config.h" #include "../../config.h"
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#define ws2812_PORTREG PORTD #define RGB_DI_PIN D1
#define ws2812_DDRREG DDRD #define RGBLIGHT_TIMER
#define ws2812_pin PD1
#define RGBLED_NUM 28 // Number of LEDs #define RGBLED_NUM 28 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17

@ -62,9 +62,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
) )
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#define ws2812_PORTREG PORTD #define RGB_DI_PIN D1
#define ws2812_DDRREG DDRD #define RGBLIGHT_TIMER
#define ws2812_pin PD1
#define RGBLED_NUM 28 // Number of LEDs #define RGBLED_NUM 28 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17

@ -65,13 +65,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Underlight configuration /* Underlight configuration
*/ */
#define ws2812_PORTREG PORTE
#define ws2812_DDRREG DDRE #define RGB_DI_PIN E2
#define ws2812_pin 2 #define RGBLIGHT_TIMER
#define RGBLED_NUM 8 // Number of LEDs #define RGBLED_NUM 8 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17 #define RGBLIGHT_VAL_STEP 17
/* /*
* Feature disable options * Feature disable options

@ -19,12 +19,16 @@
// Setleds for standard RGB // Setleds for standard RGB
void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds) void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds)
{ {
ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); // ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin));
ws2812_setleds_pin(ledarray,leds, _BV(RGB_DI_PIN & 0xF));
} }
void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask) void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask)
{ {
ws2812_DDRREG |= pinmask; // Enable DDR // ws2812_DDRREG |= pinmask; // Enable DDR
// new universal format (DDR)
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= pinmask;
ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask); ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask);
_delay_us(50); _delay_us(50);
} }
@ -32,14 +36,17 @@ void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pin
// Setleds for SK6812RGBW // Setleds for SK6812RGBW
void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds) void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds)
{ {
ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR // ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR
ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(ws2812_pin)); // new universal format (DDR)
_SFR_IO8((RGB_DI_PIN >> 4) + 1) |= _BV(RGB_DI_PIN & 0xF);
ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(RGB_DI_PIN & 0xF));
_delay_us(80); _delay_us(80);
} }
void ws2812_sendarray(uint8_t *data,uint16_t datlen) void ws2812_sendarray(uint8_t *data,uint16_t datlen)
{ {
ws2812_sendarray_mask(data,datlen,_BV(ws2812_pin)); ws2812_sendarray_mask(data,datlen,_BV(RGB_DI_PIN & 0xF));
} }
/* /*
@ -108,8 +115,10 @@ void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi)
uint8_t curbyte,ctr,masklo; uint8_t curbyte,ctr,masklo;
uint8_t sreg_prev; uint8_t sreg_prev;
masklo =~maskhi&ws2812_PORTREG; // masklo =~maskhi&ws2812_PORTREG;
maskhi |= ws2812_PORTREG; // maskhi |= ws2812_PORTREG;
masklo =~maskhi&_SFR_IO8((RGB_DI_PIN >> 4) + 2);
maskhi |= _SFR_IO8((RGB_DI_PIN >> 4) + 2);
sreg_prev=SREG; sreg_prev=SREG;
cli(); cli();
@ -173,7 +182,7 @@ w_nop16
" dec %0 \n\t" // '1' [+2] '0' [+2] " dec %0 \n\t" // '1' [+2] '0' [+2]
" brne loop%=\n\t" // '1' [+3] '0' [+4] " brne loop%=\n\t" // '1' [+3] '0' [+4]
: "=&d" (ctr) : "=&d" (ctr)
: "r" (curbyte), "I" (_SFR_IO_ADDR(ws2812_PORTREG)), "r" (maskhi), "r" (masklo) : "r" (curbyte), "I" (_SFR_IO_ADDR(_SFR_IO8((RGB_DI_PIN >> 4) + 2))), "r" (maskhi), "r" (masklo)
); );
} }

@ -146,7 +146,9 @@ void rgblight_init(void) {
} }
eeconfig_debug_rgblight(); // display current eeprom values eeconfig_debug_rgblight(); // display current eeprom values
rgblight_timer_init(); // setup the timer #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
rgblight_timer_init(); // setup the timer
#endif
if (rgblight_config.enable) { if (rgblight_config.enable) {
rgblight_mode(rgblight_config.mode); rgblight_mode(rgblight_config.mode);
@ -192,14 +194,19 @@ void rgblight_mode(uint8_t mode) {
eeconfig_update_rgblight(rgblight_config.raw); eeconfig_update_rgblight(rgblight_config.raw);
xprintf("rgblight mode: %u\n", rgblight_config.mode); xprintf("rgblight mode: %u\n", rgblight_config.mode);
if (rgblight_config.mode == 1) { if (rgblight_config.mode == 1) {
rgblight_timer_disable(); #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
rgblight_timer_disable();
#endif
} else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) { } else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) {
// MODE 2-5, breathing // MODE 2-5, breathing
// MODE 6-8, rainbow mood // MODE 6-8, rainbow mood
// MODE 9-14, rainbow swirl // MODE 9-14, rainbow swirl
// MODE 15-20, snake // MODE 15-20, snake
// MODE 21-23, knight // MODE 21-23, knight
rgblight_timer_enable();
#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
rgblight_timer_enable();
#endif
} }
rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val); rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
} }
@ -211,7 +218,10 @@ void rgblight_toggle(void) {
if (rgblight_config.enable) { if (rgblight_config.enable) {
rgblight_mode(rgblight_config.mode); rgblight_mode(rgblight_config.mode);
} else { } else {
rgblight_timer_disable();
#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
rgblight_timer_disable();
#endif
_delay_ms(50); _delay_ms(50);
rgblight_set(); rgblight_set();
} }
@ -328,6 +338,9 @@ void rgblight_set(void) {
} }
} }
#if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
// Animation timer -- AVR Timer3 // Animation timer -- AVR Timer3
void rgblight_timer_init(void) { void rgblight_timer_init(void) {
static uint8_t rgblight_timer_is_init = 0; static uint8_t rgblight_timer_is_init = 0;
@ -503,3 +516,5 @@ void rgblight_effect_knight(uint8_t interval) {
} }
} }
#endif

@ -1,8 +1,11 @@
#ifndef RGBLIGHT_H #ifndef RGBLIGHT_H
#define RGBLIGHT_H #define RGBLIGHT_H
#ifndef RGBLIGHT_MODES
#define RGBLIGHT_MODES 23 #if !defined(AUDIO_ENABLE) && defined(RGBLIGHT_TIMER)
#define RGBLIGHT_MODES 23
#else
#define RGBLIGHT_MODES 1
#endif #endif
#ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH #ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH

@ -704,23 +704,18 @@ For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring
RGBLIGHT_ENABLE = yes RGBLIGHT_ENABLE = yes
Please note that the underglow is not compatible with audio output. So you cannot enable both of them at the same time. In order to use the underglow timer functions, you need to have `#define RGBLIGHT_TIMER` in your `config.h`, and have audio disabled (`AUDIO_ENABLE = no` in your Makefile).
Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the F4 by default: Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the `F4` pin by default:
#define ws2812_PORTREG PORTF #define RGB_DI_PIN F4 // The pin your RGB strip is wired to
#define ws2812_DDRREG DDRF #define RGBLIGHT_TIMER // Require for fancier stuff (not compatible with audio)
#define ws2812_pin PF4
#define RGBLED_NUM 14 // Number of LEDs #define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17 #define RGBLIGHT_VAL_STEP 17
You'll need to edit `PORTF`, `DDRF`, and `PF4` on the first three lines to the port/pin you have your LED(s) wired to, eg for B3 change things to: You'll need to edit `RGB_DI_PIN` to the pin you have your `DI` on your RGB strip wired to.
#define ws2812_PORTREG PORTB
#define ws2812_DDRREG DDRB
#define ws2812_pin PB3
The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboards/planck/keymaps/yang/keymap.c` The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboards/planck/keymaps/yang/keymap.c`

Loading…
Cancel
Save