From 096696d86dc7f924a61f43428096107505f3cb45 Mon Sep 17 00:00:00 2001 From: Xelus22 <17491233+Xelus22@users.noreply.github.com> Date: Wed, 18 Jun 2025 19:44:49 +1000 Subject: [PATCH 01/37] [Bug] Fix `usb_endpoint_interface_lut` multiple def compile err (#25378) --- tmk_core/protocol/chibios/usb_endpoints.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/protocol/chibios/usb_endpoints.h b/tmk_core/protocol/chibios/usb_endpoints.h index a4e5ed88fce..9fad83726e9 100644 --- a/tmk_core/protocol/chibios/usb_endpoints.h +++ b/tmk_core/protocol/chibios/usb_endpoints.h @@ -121,7 +121,7 @@ typedef enum { #define IS_VALID_USB_ENDPOINT_IN_LUT(i) ((i) >= 0 && (i) < USB_ENDPOINT_IN_COUNT) -usb_endpoint_in_lut_t usb_endpoint_interface_lut[TOTAL_INTERFACES]; +extern usb_endpoint_in_lut_t usb_endpoint_interface_lut[TOTAL_INTERFACES]; typedef enum { #if defined(RAW_ENABLE) From 03a53e29af8983e1d3185fc6557312f341ec4c9f Mon Sep 17 00:00:00 2001 From: Christoffer Larsen Date: Thu, 19 Jun 2025 23:15:54 +0200 Subject: [PATCH 02/37] Fix Enter key matrix coordinates for smk65/revf ISO layout (#25373) --- keyboards/lfkeyboards/smk65/revf/keyboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lfkeyboards/smk65/revf/keyboard.json b/keyboards/lfkeyboards/smk65/revf/keyboard.json index 4e8a44d3bcb..1dd58441fc5 100644 --- a/keyboards/lfkeyboards/smk65/revf/keyboard.json +++ b/keyboards/lfkeyboards/smk65/revf/keyboard.json @@ -133,7 +133,7 @@ {"matrix": [2, 10], "x": 10.75, "y": 2}, {"matrix": [2, 11], "x": 11.75, "y": 2}, {"matrix": [2, 12], "x": 12.75, "y": 2}, - {"matrix": [1, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [2, 14], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, {"matrix": [2, 15], "x": 15, "y": 2}, {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, From bb27c69675f1adfd91d8bfc3cf6f7fd537f74729 Mon Sep 17 00:00:00 2001 From: Marius <42906082+craft-coder@users.noreply.github.com> Date: Thu, 19 Jun 2025 23:23:53 +0200 Subject: [PATCH 03/37] Applied usb detection fixes from Squalius-cephalus (#25380) Co-authored-by: Dr. Marius Feilhauer --- keyboards/silakka54/keyboard.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/keyboards/silakka54/keyboard.json b/keyboards/silakka54/keyboard.json index e1ad9aac9ed..f04b67d3aa7 100644 --- a/keyboards/silakka54/keyboard.json +++ b/keyboards/silakka54/keyboard.json @@ -14,6 +14,9 @@ "enabled": true, "serial": { "driver": "vendor" + }, + "transport": { + "watchdog": true } }, "matrix_pins": { From 6626084cb8a77bb1e0d94082722fd21d783f4b27 Mon Sep 17 00:00:00 2001 From: ClownFish <177758267+clownfish-og@users.noreply.github.com> Date: Thu, 19 Jun 2025 17:24:37 -0400 Subject: [PATCH 04/37] fix incorrect damapad layout macros (#25364) --- keyboards/bolsa/damapad/keyboard.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/keyboards/bolsa/damapad/keyboard.json b/keyboards/bolsa/damapad/keyboard.json index b48e8c3586b..1a31316f9ce 100644 --- a/keyboards/bolsa/damapad/keyboard.json +++ b/keyboards/bolsa/damapad/keyboard.json @@ -30,13 +30,13 @@ "layouts": { "LAYOUT_wkl": { "layout": [ - {"matrix": [0, 0], "x": 5.25, "y": 0}, + {"matrix": [0, 0], "x": 0, "y": 0.25}, + {"matrix": [0, 1], "x": 1, "y": 0.25}, + {"matrix": [0, 2], "x": 2, "y": 0.25}, + {"matrix": [0, 3], "x": 3, "y": 0.25}, + {"matrix": [0, 4], "x": 4, "y": 0.25}, - {"matrix": [0, 1], "x": 0, "y": 0.25}, - {"matrix": [0, 2], "x": 1, "y": 0.25}, - {"matrix": [0, 3], "x": 2, "y": 0.25}, - {"matrix": [0, 4], "x": 3, "y": 0.25}, - {"matrix": [0, 5], "x": 4, "y": 0.25}, + {"matrix": [0, 5], "x": 5.25, "y": 0}, {"matrix": [1, 0], "x": 0, "y": 1.25}, {"matrix": [1, 1], "x": 1, "y": 1.25}, @@ -55,13 +55,13 @@ }, "LAYOUT_bar": { "layout": [ - {"matrix": [0, 0], "x": 5.25, "y": 0}, + {"matrix": [0, 0], "x": 0, "y": 0.25}, + {"matrix": [0, 1], "x": 1, "y": 0.25}, + {"matrix": [0, 2], "x": 2, "y": 0.25}, + {"matrix": [0, 3], "x": 3, "y": 0.25}, + {"matrix": [0, 4], "x": 4, "y": 0.25}, - {"matrix": [0, 1], "x": 0, "y": 0.25}, - {"matrix": [0, 2], "x": 1, "y": 0.25}, - {"matrix": [0, 3], "x": 2, "y": 0.25}, - {"matrix": [0, 4], "x": 3, "y": 0.25}, - {"matrix": [0, 5], "x": 4, "y": 0.25}, + {"matrix": [0, 5], "x": 5.25, "y": 0}, {"matrix": [1, 0], "x": 0, "y": 1.25}, {"matrix": [1, 1], "x": 1, "y": 1.25}, @@ -71,7 +71,7 @@ {"matrix": [1, 5], "x": 5.25, "y": 1.25}, - {"matrix": [2, 0], "x": 0, "y": 2.25, "w": 2.75}, + {"matrix": [2, 1], "x": 0, "y": 2.25, "w": 2.75}, {"matrix": [2, 3], "x": 2.75, "y": 2.25, "w": 2.25}, {"matrix": [2, 5], "x": 5.25, "y": 2.25} From 664c0bc4c32d3f2c287f02ef4f786c32c0f51cb9 Mon Sep 17 00:00:00 2001 From: YodaDistro <55962164+YodaDistro@users.noreply.github.com> Date: Sat, 21 Jun 2025 06:31:49 -0500 Subject: [PATCH 05/37] Add YodaDistro Macropad (#25174) Co-authored-by: Joel Challis Co-authored-by: Drashna Jaelre Co-authored-by: Less/Rikki <86894501+lesshonor@users.noreply.github.com> --- .../handwired/yodadistro/macro/keyboard.json | 33 +++++++++++++++++++ .../macro/keymaps/default/keymap.json | 11 +++++++ .../handwired/yodadistro/macro/readme.md | 25 ++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 keyboards/handwired/yodadistro/macro/keyboard.json create mode 100644 keyboards/handwired/yodadistro/macro/keymaps/default/keymap.json create mode 100644 keyboards/handwired/yodadistro/macro/readme.md diff --git a/keyboards/handwired/yodadistro/macro/keyboard.json b/keyboards/handwired/yodadistro/macro/keyboard.json new file mode 100644 index 00000000000..f0a03453b4d --- /dev/null +++ b/keyboards/handwired/yodadistro/macro/keyboard.json @@ -0,0 +1,33 @@ +{ + "manufacturer": "Raspberry Pi", + "keyboard_name": "KBP 8-Key Macro Pad", + "maintainer": "yodadistro", + "bootloader": "rp2040", + "diode_direction": "COL2ROW", + "matrix_pins": { + "direct": [ + ["GP3", "GP5", "GP7", "GP9"], + ["GP2", "GP4", "GP6", "GP8"] + ] + }, + "processor": "RP2040", + "usb": { + "device_version": "1.0.0", + "pid": "0x2044", + "vid": "0x1209" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 2, "y": 1}, + {"matrix": [1, 3], "x": 3, "y": 1} + ] + } + } +} diff --git a/keyboards/handwired/yodadistro/macro/keymaps/default/keymap.json b/keyboards/handwired/yodadistro/macro/keymaps/default/keymap.json new file mode 100644 index 00000000000..5f5ccb88b0c --- /dev/null +++ b/keyboards/handwired/yodadistro/macro/keymaps/default/keymap.json @@ -0,0 +1,11 @@ +{ + "keyboard": "handwired/yodadistro/macro", + "keymap": "default", + "layout": "LAYOUT", + "layers": [ + [ + "KC_A", "KC_B", "KC_C", "KC_D", + "KC_E", "KC_F", "KC_G", "KC_H" + ] + ] +} diff --git a/keyboards/handwired/yodadistro/macro/readme.md b/keyboards/handwired/yodadistro/macro/readme.md new file mode 100644 index 00000000000..ceda19acba1 --- /dev/null +++ b/keyboards/handwired/yodadistro/macro/readme.md @@ -0,0 +1,25 @@ +# Yoda Distro + +![YodaDistro](https://i.imgur.com/W2xnKjF.jpeg) + +Scratch made direct wire pin 8-Key (4x2) Macro Pad using a Raspberry Pi Pico (2040). + +* Keyboard Maintainer: [YodaDistro](https://github.com/YodaDistro) +* Hardware Supported: Raspberry Pi Pico (2040) +* Hardware Availability: 3D Printed Design (https://github.com/YodaDistro/MacroPad) + +Make example for this keyboard (after setting up your build environment): + + make handwired/yodadistro/macro:default + +Flashing example for this keyboard: + + make handwired/yodadistro/macro:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs) + +## Bootloader + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From 1ac255fd1ceda45d551817a80d7dc1a2c8986771 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 22 Jun 2025 12:33:53 +1000 Subject: [PATCH 06/37] [docs] Change GUI key references to "Meta" -> "Super" (#25394) --- docs/keycodes.md | 4 ++-- docs/keycodes_basic.md | 20 ++++++++++---------- docs/mod_tap.md | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index cf170721c81..891a4f6f17b 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -176,11 +176,11 @@ See also: [Basic Keycodes](keycodes_basic) |`KC_LEFT_CTRL` |`KC_LCTL` |Left Control |✔ |✔ |✔ | |`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift |✔ |✔ |✔ | |`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) |✔ |✔ |✔ | -|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) |✔ |✔ |✔ | +|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Super key) |✔ |✔ |✔ | |`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control |✔ |✔ |✔ | |`KC_RIGHT_SHIFT` |`KC_RSFT` |Right Shift |✔ |✔ |✔ | |`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) |✔ |✔ |✔ | -|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key) |✔ |✔ |✔ | +|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Super key) |✔ |✔ |✔ | |`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |✔ |✔3|✔ | |`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |✔ |✔3|✔ | |`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake | |✔3|✔ | diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 6ff422f89b1..66dfbe6dedd 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -108,16 +108,16 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07 ## Modifiers -|Key |Aliases |Description | -|----------------|-------------------------------|------------------------------------| -|`KC_LEFT_CTRL` |`KC_LCTL` |Left Control | -|`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift | -|`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) | -|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) | -|`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control | -|`KC_RIGHT_SHIFT`|`KC_RSFT` |Right Shift | -|`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) | -|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key)| +|Key |Aliases |Description | +|----------------|-------------------------------|-------------------------------------| +|`KC_LEFT_CTRL` |`KC_LCTL` |Left Control | +|`KC_LEFT_SHIFT` |`KC_LSFT` |Left Shift | +|`KC_LEFT_ALT` |`KC_LALT`, `KC_LOPT` |Left Alt (Option) | +|`KC_LEFT_GUI` |`KC_LGUI`, `KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Super key) | +|`KC_RIGHT_CTRL` |`KC_RCTL` |Right Control | +|`KC_RIGHT_SHIFT`|`KC_RSFT` |Right Shift | +|`KC_RIGHT_ALT` |`KC_RALT`, `KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) | +|`KC_RIGHT_GUI` |`KC_RGUI`, `KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Super key)| ## International diff --git a/docs/mod_tap.md b/docs/mod_tap.md index da2ecc9a854..8b420d30b62 100644 --- a/docs/mod_tap.md +++ b/docs/mod_tap.md @@ -9,11 +9,11 @@ The modifiers (`mod`) argument to the `MT()` macro are prefixed with `MOD_`, not |`MOD_LCTL`|Left Control | |`MOD_LSFT`|Left Shift | |`MOD_LALT`|Left Alt | -|`MOD_LGUI`|Left GUI (Windows/Command/Meta key) | +|`MOD_LGUI`|Left GUI (Windows/Command/Super key) | |`MOD_RCTL`|Right Control | |`MOD_RSFT`|Right Shift | |`MOD_RALT`|Right Alt (AltGr) | -|`MOD_RGUI`|Right GUI (Windows/Command/Meta key) | +|`MOD_RGUI`|Right GUI (Windows/Command/Super key) | |`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)| |`MOD_MEH` |Meh (Left Control, Shift, and Alt) | From 611460c9db39f62659e5a4e481d36e44c590d40d Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 22 Jun 2025 17:11:53 +1000 Subject: [PATCH 07/37] ymdk/id75: fix keymap (#25396) --- keyboards/ymdk/id75/keymaps/default/keymap.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ymdk/id75/keymaps/default/keymap.json b/keyboards/ymdk/id75/keymaps/default/keymap.json index 7d0664c0a6b..595841449e0 100644 --- a/keyboards/ymdk/id75/keymaps/default/keymap.json +++ b/keyboards/ymdk/id75/keymaps/default/keymap.json @@ -2,7 +2,7 @@ "version": 1, "author": "qmk", "notes": "", - "keyboard": "ymdk/id75", + "keyboard": "ymdk/id75/f103", "keymap": "default", "layout": "LAYOUT_ortho_5x15", "layers": [ From f5b02fbc116d7c6444db1e5e4de84d357fb931c8 Mon Sep 17 00:00:00 2001 From: Andrew Litt Date: Mon, 23 Jun 2025 04:18:48 -0500 Subject: [PATCH 08/37] Fix inverted encoder on Inland KB83 (#25400) --- keyboards/inland/kb83/keyboard.json | 2 +- keyboards/inland/kb83/keymaps/default/keymap.c | 8 ++++---- keyboards/inland/kb83/keymaps/default/rules.mk | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 keyboards/inland/kb83/keymaps/default/rules.mk diff --git a/keyboards/inland/kb83/keyboard.json b/keyboards/inland/kb83/keyboard.json index 4c82a557ee7..2920da52e1c 100644 --- a/keyboards/inland/kb83/keyboard.json +++ b/keyboards/inland/kb83/keyboard.json @@ -60,7 +60,7 @@ }, "encoder": { "rotary": [ - {"pin_a": "B14", "pin_b": "B13", "resolution": 4} + {"pin_a": "B13", "pin_b": "B14", "resolution": 4} ] }, "qmk": { diff --git a/keyboards/inland/kb83/keymaps/default/keymap.c b/keyboards/inland/kb83/keymaps/default/keymap.c index a564e4e4e14..df7df65678d 100644 --- a/keyboards/inland/kb83/keymaps/default/keymap.c +++ b/keyboards/inland/kb83/keymaps/default/keymap.c @@ -64,10 +64,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #if defined(ENCODER_MAP_ENABLE) const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [WIN_B] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD) }, - [WIN_FN] = { ENCODER_CCW_CW(RM_SATU, RM_SATD) }, - [MAC_B] = { ENCODER_CCW_CW(KC_VOLU, KC_VOLD) }, - [MAC_FN] = { ENCODER_CCW_CW(RM_SATU, RM_SATD) }, + [WIN_B] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [WIN_FN] = { ENCODER_CCW_CW(RM_SATD, RM_SATU) }, + [MAC_B] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [MAC_FN] = { ENCODER_CCW_CW(RM_SATD, RM_SATU) }, }; #endif diff --git a/keyboards/inland/kb83/keymaps/default/rules.mk b/keyboards/inland/kb83/keymaps/default/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/inland/kb83/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes From de5fd5d4e2efe05373eacefc95aa1deb15a3ebb9 Mon Sep 17 00:00:00 2001 From: Andrew Litt Date: Mon, 23 Jun 2025 17:01:56 -0500 Subject: [PATCH 09/37] Orient side LEDs on GMMK2 65% ANSI to match the rest of the matrix (#25402) Orient side LEDs on GMMK2 65% to match the rest of the matrix On GMMK2 P65 ANSI, the side LEDs were mapped to the wrong sides of the keyboard resulting in effects not being consistent with the key surface. This was most jarring in effects like pinwheel where the pattern involves the side LEDs and there is a distinctly different flow on the left and right halves of the board. This PR swaps the side LEDs in the map so that they are correctly oriented. Applied to both ANSI and ISO variants. --- keyboards/gmmk/gmmk2/p65/ansi/ansi.c | 40 ++++++++++++++-------------- keyboards/gmmk/gmmk2/p65/iso/iso.c | 40 ++++++++++++++-------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/keyboards/gmmk/gmmk2/p65/ansi/ansi.c b/keyboards/gmmk/gmmk2/p65/ansi/ansi.c index d1f01fc8cb5..b3ac9906db5 100644 --- a/keyboards/gmmk/gmmk2/p65/ansi/ansi.c +++ b/keyboards/gmmk/gmmk2/p65/ansi/ansi.c @@ -204,26 +204,26 @@ led_config_t g_led_config = {{ {196, 64}, // 65 Down {210, 64}, // 66 Right - {0, 0}, // 69 LED 1 - {0, 7}, // 70 LED 2 - {0, 14}, // 71 LED 3 - {0, 21}, // 72 LED 4 - {0, 28}, // 73 LED 5 - {0, 35}, // 74 LED 6 - {0, 42}, // 75 LED 7 - {0, 49}, // 76 LED 8 - {0, 56}, // 77 LED 9 - {0, 64}, // 78 LED 10 - {224, 0 }, // 79 LED 11 - {224, 7 }, // 80 LED 12 - {224, 14}, // 81 LED 13 - {224, 21}, // 82 LED 14 - {224, 28}, // 83 LED 15 - {224, 35}, // 84 LED 16 - {224, 42}, // 85 LED 17 - {224, 49}, // 86 LED 18 - {224, 56}, // 87 LED 19 - {224, 64}, // 88 LED 20 + {224, 0 }, // 69 LED 1 + {224, 7 }, // 70 LED 2 + {224, 14}, // 71 LED 3 + {224, 21}, // 72 LED 4 + {224, 28}, // 73 LED 5 + {224, 35}, // 74 LED 6 + {224, 42}, // 75 LED 7 + {224, 49}, // 76 LED 8 + {224, 56}, // 77 LED 9 + {224, 64}, // 78 LED 10 + {0, 0 }, // 79 LED 11 + {0, 7 }, // 80 LED 12 + {0, 14}, // 81 LED 13 + {0, 21}, // 82 LED 14 + {0, 28}, // 83 LED 15 + {0, 35}, // 84 LED 16 + {0, 42}, // 85 LED 17 + {0, 49}, // 86 LED 18 + {0, 56}, // 87 LED 19 + {0, 64}, // 88 LED 20 }, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, diff --git a/keyboards/gmmk/gmmk2/p65/iso/iso.c b/keyboards/gmmk/gmmk2/p65/iso/iso.c index 2be52853941..abadaccd348 100644 --- a/keyboards/gmmk/gmmk2/p65/iso/iso.c +++ b/keyboards/gmmk/gmmk2/p65/iso/iso.c @@ -206,26 +206,26 @@ led_config_t g_led_config = {{ {196, 64}, // 66 Down {210, 64}, // 67 Right - {0, 0}, // 68 LED 1 - {0, 7}, // 69 LED 2 - {0, 14}, // 70 LED 3 - {0, 21}, // 71 LED 4 - {0, 28}, // 72 LED 5 - {0, 35}, // 73 LED 6 - {0, 42}, // 74 LED 7 - {0, 49}, // 75 LED 8 - {0, 56}, // 76 LED 9 - {0, 64}, // 77 LED 10 - {224, 0 }, // 78 LED 11 - {224, 7 }, // 79 LED 12 - {224, 14}, // 80 LED 13 - {224, 21}, // 81 LED 14 - {224, 28}, // 82 LED 15 - {224, 35}, // 83 LED 16 - {224, 42}, // 84 LED 17 - {224, 49}, // 85 LED 18 - {224, 56}, // 86 LED 19 - {224, 64}, // 87 LED 20 + {224, 0 }, // 68 LED 1 + {224, 7 }, // 69 LED 2 + {224, 14}, // 70 LED 3 + {224, 21}, // 71 LED 4 + {224, 28}, // 72 LED 5 + {224, 35}, // 73 LED 6 + {224, 42}, // 74 LED 7 + {224, 49}, // 75 LED 8 + {224, 56}, // 76 LED 9 + {224, 64}, // 77 LED 10 + {0, 0 }, // 78 LED 11 + {0, 7 }, // 79 LED 12 + {0, 14}, // 80 LED 13 + {0, 21}, // 81 LED 14 + {0, 28}, // 82 LED 15 + {0, 35}, // 83 LED 16 + {0, 42}, // 84 LED 17 + {0, 49}, // 85 LED 18 + {0, 56}, // 86 LED 19 + {0, 64}, // 87 LED 20 }, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, From 235d18f360dbb5ab0585c734050d5b2b332fd592 Mon Sep 17 00:00:00 2001 From: Dave Alvarado Date: Thu, 26 Jun 2025 01:38:15 -0500 Subject: [PATCH 10/37] Update readme.md to clarify Lily Pad V2 support (#25405) --- keyboards/boardsource/lulu/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/boardsource/lulu/readme.md b/keyboards/boardsource/lulu/readme.md index a1c184eaacd..9304a0fa8df 100644 --- a/keyboards/boardsource/lulu/readme.md +++ b/keyboards/boardsource/lulu/readme.md @@ -6,8 +6,8 @@ The lulu is what the ergo community has needed for a long time, a high-end aesth * Keyboard Maintainer: [Boardsource](https://github.com/daysgobye) -* Hardware Supported: lulu v1 -* Hardware Availability: this keyboard is available from the [Boardsource store](https://boardsource.xyz/store/61d0b772319a1f3cc53ba2fb) +* Hardware Supported: lulu v1/v2, lily pad v2 +* Hardware Availability: this keyboard is available from the [Boardsource store](https://boardsource.xyz/products/lily-pad-pcb) Make example for this keyboard (after setting up your build environment): @@ -21,7 +21,7 @@ Flashing example for this keyboard: make boardsource/lulu/avr:default:flash -Compile `rp2040` firmware if you purchased PCB in lulu group buy (integrated microcontroller). +Compile `rp2040` firmware if you purchased PCB in lulu group buy or lily pad (integrated microcontroller). Compile `avr` firmware if your PCB uses a drop-in microcontroller like Pro Micro. From 5354ec57915d2a17f977583ff21ee8bfe3bf6747 Mon Sep 17 00:00:00 2001 From: timovp Date: Thu, 26 Jun 2025 09:19:42 +0200 Subject: [PATCH 11/37] fix order of code in tapdance example3 (#25410) --- docs/features/tap_dance.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/features/tap_dance.md b/docs/features/tap_dance.md index 8fdd83c18d1..d533e41aaaf 100644 --- a/docs/features/tap_dance.md +++ b/docs/features/tap_dance.md @@ -170,20 +170,6 @@ typedef struct { uint16_t held; } tap_dance_tap_hold_t; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - tap_dance_action_t *action; - - switch (keycode) { - case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations - action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)]; - if (!record->event.pressed && action->state.count && !action->state.finished) { - tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data; - tap_code16(tap_hold->tap); - } - } - return true; -} - void tap_dance_tap_hold_finished(tap_dance_state_t *state, void *user_data) { tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data; @@ -211,12 +197,29 @@ void tap_dance_tap_hold_reset(tap_dance_state_t *state, void *user_data) { } } -#define ACTION_TAP_DANCE_TAP_HOLD(tap, hold) \ - { .fn = {NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, .user_data = (void *)&((tap_dance_tap_hold_t){tap, hold, 0}), } +#define ACTION_TAP_DANCE_TAP_HOLD(tap, hold) \ + { \ + .fn = {NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, \ + .user_data = (void *)&((tap_dance_tap_hold_t){tap, hold, 0}), \ + } tap_dance_action_t tap_dance_actions[] = { [CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(KC_COLN, KC_SCLN), }; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + tap_dance_action_t *action; + + switch (keycode) { + case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations + action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)]; + if (!record->event.pressed && action->state.count && !action->state.finished) { + tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data; + tap_code16(tap_hold->tap); + } + } + return true; +} ``` #### Example 4: 'Quad Function Tap-Dance' {#example-4} From e15d9ca4b3329c5c97f920547c086ad768ec3808 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 27 Jun 2025 06:49:26 +0100 Subject: [PATCH 12/37] Update link to AW20216S datasheet (#25416) --- docs/drivers/aw20216s.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/drivers/aw20216s.md b/docs/drivers/aw20216s.md index 36a6d63c33b..042c8df1292 100644 --- a/docs/drivers/aw20216s.md +++ b/docs/drivers/aw20216s.md @@ -2,7 +2,7 @@ SPI 18x12 LED matrix driver by Awinic. Supports a maximum of four drivers, each controlling up to 216 single-color LEDs, or 72 RGB LEDs. -[AW20216S Datasheet](https://doc.awinic.com/doc/20230609wm/b6a9c70b-e1bd-495b-925f-bcbed3fc2620.pdf) +[AW20216S Datasheet](https://doc.awinic.com/doc/202412/a055779b-49c0-4d09-8f04-73029f44b72b.pdf) ## Usage {#usage} From 6e55870a82e8cfecd379242fd58829b37fa8ffa4 Mon Sep 17 00:00:00 2001 From: Andrew Litt Date: Fri, 27 Jun 2025 14:11:43 -0500 Subject: [PATCH 13/37] `inland/kb83`: Remove unnecessary EEPROM write (#25401) There's no reason to save the base layer to EEPROM when the base layer is set based on DIP switch. --- keyboards/inland/kb83/kb83.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/keyboards/inland/kb83/kb83.c b/keyboards/inland/kb83/kb83.c index 41a3ad8df72..07d8bdbdb41 100644 --- a/keyboards/inland/kb83/kb83.c +++ b/keyboards/inland/kb83/kb83.c @@ -313,11 +313,7 @@ bool dip_switch_update_kb(uint8_t index, bool active) { return false; } if (index == 0) { - default_layer_set(1UL << (active ? 2 : 0)); - } - if(active){ - keymap_config.no_gui = 0; - eeconfig_update_keymap(&keymap_config); + default_layer_set(1UL << (active ? MAC_B : WIN_B)); } return true; } From 4ae2b4f371f6ed4a8b35a55ff6a244645c28e612 Mon Sep 17 00:00:00 2001 From: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Date: Sat, 28 Jun 2025 03:00:50 +0700 Subject: [PATCH 14/37] [Keyboard] Add support S6xty Tsangan (#24898) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update support S6xty5 * Delete chconf.h * Update manufacturer, community layout for hhkb * Update layout * fix row index * Update tyson60s * Update community layout and layout name * Update remove rgb test mode * Update capslock led * Apply suggestions from code review Co-authored-by: Duncan Sutherland * Remove deprecated s6xty5 * Update support S6xty Tsangan * Update pinout config * Update render * Update default animation * Update layout * Update keymap keycode * Update hardware supported * Update keyboard.json * Update layout s6xty tsangan * Update led indicator for s6xtyfs * Apply suggestions from code review Co-authored-by: Duncan Sutherland --------- Co-authored-by: Trần Thanh Sơn Co-authored-by: Duncan Sutherland --- keyboards/trnthsn/s6xtyfs/config.h | 23 + keyboards/trnthsn/s6xtyfs/halconf.h | 22 + keyboards/trnthsn/s6xtyfs/info.json | 742 ++++++++++++++++++ .../trnthsn/s6xtyfs/keymaps/default/keymap.c | 40 + keyboards/trnthsn/s6xtyfs/mcuconf.h | 23 + keyboards/trnthsn/s6xtyfs/readme.md | 27 + keyboards/trnthsn/s6xtyfs/s6xtyfs.c | 24 + .../trnthsn/s6xtyfs/stm32f072/keyboard.json | 4 + .../trnthsn/s6xtyfs/stm32f103/keyboard.json | 4 + 9 files changed, 909 insertions(+) create mode 100644 keyboards/trnthsn/s6xtyfs/config.h create mode 100644 keyboards/trnthsn/s6xtyfs/halconf.h create mode 100644 keyboards/trnthsn/s6xtyfs/info.json create mode 100644 keyboards/trnthsn/s6xtyfs/keymaps/default/keymap.c create mode 100644 keyboards/trnthsn/s6xtyfs/mcuconf.h create mode 100644 keyboards/trnthsn/s6xtyfs/readme.md create mode 100644 keyboards/trnthsn/s6xtyfs/s6xtyfs.c create mode 100644 keyboards/trnthsn/s6xtyfs/stm32f072/keyboard.json create mode 100644 keyboards/trnthsn/s6xtyfs/stm32f103/keyboard.json diff --git a/keyboards/trnthsn/s6xtyfs/config.h b/keyboards/trnthsn/s6xtyfs/config.h new file mode 100644 index 00000000000..5e5c1eb155c --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/config.h @@ -0,0 +1,23 @@ +/* +Copyright 2025 Tyson.Keebs + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#define WS2812_SPI_DRIVER SPID2 +#define WS2812_SPI_MOSI_PAL_MODE 0 +#define WS2812_SPI_SCK_PAL_MODE 0 +#define WS2812_SPI_SCK_PIN B13 diff --git a/keyboards/trnthsn/s6xtyfs/halconf.h b/keyboards/trnthsn/s6xtyfs/halconf.h new file mode 100644 index 00000000000..737b1927a36 --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/halconf.h @@ -0,0 +1,22 @@ +/* +Copyright 2025 Tyson.Keebs + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/trnthsn/s6xtyfs/info.json b/keyboards/trnthsn/s6xtyfs/info.json new file mode 100644 index 00000000000..132c1a4e977 --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/info.json @@ -0,0 +1,742 @@ +{ + "manufacturer": "Tyson.Keebs", + "keyboard_name": "S6xty Tsangan", + "maintainer": "trnthsn", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "indicators": { + "caps_lock": "B0" + }, + "matrix_pins": { + "cols": ["A10", "A9", "A8", "B14", "B12", "A6", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15"], + "rows": ["C13", "C14", "C15", "A1", "B1"] + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "default": { + "animation": "rainbow_swirl" + }, + "layers": { + "enabled": true, + "override_rgb": false + }, + "led_count": 28, + "sleep": true + }, + "url": "", + "usb": { + "device_version": "1.0.0", + "pid": "0x3666", + "vid": "0x5453" + }, + "ws2812": { + "driver": "spi", + "pin": "B15" + }, + "community_layouts": ["60_ansi_tsangan", "60_ansi_tsangan_split_bs_rshift", "60_ansi_wkl", "60_ansi_wkl_split_bs_rshift", "60_hhkb", "60_iso_tsangan", "60_iso_tsangan_split_bs_rshift", "60_iso_wkl", "60_iso_wkl_split_bs_rshift"], + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [2, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 0, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_tsangan_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [2, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_wkl": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_ansi_wkl_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [2, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_hhkb": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [2, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4} + ] + }, + "LAYOUT_60_iso_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h":2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso_tsangan_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [2, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h":2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 12], "x": 12.5, "y": 4}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso_wkl": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h":2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 2.75}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_iso_wkl_split_bs_rshift": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [2, 12], "x": 13, "y": 0}, + {"matrix": [0, 13], "x": 14, "y": 0}, + + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [1, 13], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h":2}, + + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5} + ] + } + } +} diff --git a/keyboards/trnthsn/s6xtyfs/keymaps/default/keymap.c b/keyboards/trnthsn/s6xtyfs/keymaps/default/keymap.c new file mode 100644 index 00000000000..ecddf112d2a --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/keymaps/default/keymap.c @@ -0,0 +1,40 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + // │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │Bsp│Bsp│ + // ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + // │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + // ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬────┤ + // │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │Ent │ + // ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┤ + // │Sft │Sft│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │Shift │Fn │ + // ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ + // │Ctrl │Win│Alt │ │Alt │Win│Ctrl │ + // └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ + + [0] = LAYOUT_all( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_LSFT ,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL + ), + [1] = LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + _______, _______, _______, _______, _______, _______, _______, UG_NEXT, UG_VALD, UG_VALU, KC_PSCR, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + MO(2) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ), + [2] = LAYOUT_all( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/trnthsn/s6xtyfs/mcuconf.h b/keyboards/trnthsn/s6xtyfs/mcuconf.h new file mode 100644 index 00000000000..03624a3d2fd --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/mcuconf.h @@ -0,0 +1,23 @@ +/* +Copyright 2025 Tyson.Keebs + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#pragma once + +#include_next + +#undef STM32_SPI_USE_SPI2 +#define STM32_SPI_USE_SPI2 TRUE diff --git a/keyboards/trnthsn/s6xtyfs/readme.md b/keyboards/trnthsn/s6xtyfs/readme.md new file mode 100644 index 00000000000..be888ece758 --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/readme.md @@ -0,0 +1,27 @@ +# S6xty Tsangan + +![S6xtyfs](https://i.imgur.com/uS2Okww.png) + +A 60% keyboard PCB. Supports multiple layout such as split backspace, split shift, iso. + +* Keyboard Maintainer: [Trnthsn](https://github.com/trnthsn) +* Hardware Supported: STM32, S6xtyfs +* Hardware Availability: [ThanhSon.Mech](https://www.facebook.com/ThanhSon.mech) + +Make example for this keyboard (after setting up your build environment): + + make trnthsn/s6xtyfs/stm32f103:default + +Flashing example for this keyboard: + + make trnthsn/s6xtyfs/stm32f103:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/trnthsn/s6xtyfs/s6xtyfs.c b/keyboards/trnthsn/s6xtyfs/s6xtyfs.c new file mode 100644 index 00000000000..9a9df177b91 --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/s6xtyfs.c @@ -0,0 +1,24 @@ +// Copyright 2025 QMK +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE +const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {5, 2, HSV_WHITE} +); +const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST( + my_capslock_layer +); + +void keyboard_post_init_kb(void) { + rgblight_layers = my_rgb_layers; + keyboard_post_init_user(); +} +bool led_update_kb(led_t led_state) { + bool res = led_update_user(led_state); + if (res) { + rgblight_set_layer_state(0, led_state.caps_lock); + } + return res; +} +#endif diff --git a/keyboards/trnthsn/s6xtyfs/stm32f072/keyboard.json b/keyboards/trnthsn/s6xtyfs/stm32f072/keyboard.json new file mode 100644 index 00000000000..8bba6f5d5da --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/stm32f072/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F072", + "bootloader": "stm32-dfu" +} diff --git a/keyboards/trnthsn/s6xtyfs/stm32f103/keyboard.json b/keyboards/trnthsn/s6xtyfs/stm32f103/keyboard.json new file mode 100644 index 00000000000..4dc77604c43 --- /dev/null +++ b/keyboards/trnthsn/s6xtyfs/stm32f103/keyboard.json @@ -0,0 +1,4 @@ +{ + "processor": "STM32F103", + "bootloader": "uf2boot" +} From 89e39b98587f9d12d3b4b6659c7655df63b8633b Mon Sep 17 00:00:00 2001 From: Peter Cock Date: Sat, 28 Jun 2025 05:23:05 +0900 Subject: [PATCH 15/37] [Docs] Link to `awesome-qmk` userspaces repository (#25357) * Fix link - users folder now empty on default branch * Point at drashna/qmk_userspace repo * Link to awesome-qmk instead --- docs/feature_userspace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index d19b86cb46c..0f5c4a5f966 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -119,7 +119,7 @@ This is ideal for when you want ensure everything compiles successfully when pre ## Examples For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example). -For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. +For more complicated examples, checkout the [`awesome-qmk` colletion](https://github.com/qmk/awesome-qmk). ### Customized Functions From 36636205ddc835a6bb6f630179cd9395ea8b0689 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sat, 28 Jun 2025 12:44:24 +1000 Subject: [PATCH 16/37] Clean up mod & mod-tap shortcuts (#25399) --- docs/feature_advanced_keycodes.md | 55 +++++++------ docs/keycodes.md | 110 +++++++++++++++----------- docs/mod_tap.md | 55 +++++++------ quantum/quantum_keycodes.h | 124 ++++++++++++++++++------------ quantum/quantum_keycodes_legacy.h | 2 + 5 files changed, 206 insertions(+), 140 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 18740044f43..b21accd3671 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -2,29 +2,40 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent. -|Key |Aliases |Description | -|----------|----------------------------------|------------------------------------------------------| -|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` | -|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` | -|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` | -|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` | -|`RCTL(kc)`| |Hold Right Control and press `kc` | -|`RSFT(kc)`| |Hold Right Shift and press `kc` | -|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` | -|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` | -|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | -|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` | -|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` | -|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` | -|`LCA(kc)` | |Hold Left Control and Alt and press `kc` | -|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` | -|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` | -|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` | -|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | -|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | -|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` | +|Key |Aliases |Description | +|----------|----------------------------------|-------------------------------------------------------------------------------| +|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` | +|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` | +|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` | +|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` | +|`LCS(kc)` | |Hold Left Control and Left Shift and press `kc` | +|`LCA(kc)` | |Hold Left Control and Left Alt and press `kc` | +|`LCG(kc)` | |Hold Left Control and Left GUI and press `kc` | +|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` | +|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and Left GUI and press `kc` | +|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` | +|`LCSG(kc)`| |Hold Left Control, Left Shift and Left GUI and press `kc` | +|`LCAG(kc)`| |Hold Left Control, Left Alt and Left GUI and press `kc` | +|`LSAG(kc)`| |Hold Left Shift, Left Alt and Left GUI and press `kc` | +|`RCTL(kc)`| |Hold Right Control and press `kc` | +|`RSFT(kc)`| |Hold Right Shift and press `kc` | +|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` | +|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` | +|`RCA(kc)` | |Hold Right Control and Right Alt and press `kc` | +|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` | +|`RCG(kc)` | |Hold Right Control and Right GUI and press `kc` | +|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt and press `kc` | +|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` | +|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` | +|`RCSG(kc)`| |Hold Right Control, Right Shift and Right GUI and press `kc` | +|`RCAG(kc)`| |Hold Right Control, Right Alt and Right GUI and press `kc` | +|`RSAG(kc)`| |Hold Right Shift, Right Alt and Right GUI and press `kc` | +|`MEH(kc)` | |Hold Left Control, Left Shift and Left Alt and press `kc` | +|`HYPR(kc)`| |Hold Left Control, Left Shift, Left Alt and Left GUI and press `kc`1| -You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress. +1. More information on the Hyper key can be found on [this blog post by Brett Terpstra](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/). + +You can also chain them, for example `LCTL(LALT(KC_DEL))`, `C(A(KC_DEL))`, or `LCA(KC_DEL)` all make a key that sends Control+Alt+Delete with a single keypress. # Checking Modifier State {#checking-modifier-state} diff --git a/docs/keycodes.md b/docs/keycodes.md index 891a4f6f17b..5d983e347ef 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -658,58 +658,74 @@ See also: [Mouse Keys](features/mouse_keys) See also: [Modifier Keys](feature_advanced_keycodes#modifier-keys) -|Key |Aliases |Description | -|----------|----------------------------------|------------------------------------------------------| -|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` | -|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` | -|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` | -|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` | -|`RCTL(kc)`| |Hold Right Control and press `kc` | -|`RSFT(kc)`| |Hold Right Shift and press `kc` | -|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt (AltGr) and press `kc` | -|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` | -|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and Left GUI and press `kc` | -|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` | -|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` | -|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` | -|`LCA(kc)` | |Hold Left Control and Alt and press `kc` | -|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` | -|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` | -|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` | -|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | -|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | -|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` | -|`KC_MEH` | |Left Control, Shift and Alt | -|`KC_HYPR` | |Left Control, Shift, Alt and GUI | +|Key |Aliases |Description | +|----------|----------------------------------|-------------------------------------------------------------------| +|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` | +|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` | +|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` | +|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` | +|`LCS(kc)` | |Hold Left Control and Left Shift and press `kc` | +|`LCA(kc)` | |Hold Left Control and Left Alt and press `kc` | +|`LCG(kc)` | |Hold Left Control and Left GUI and press `kc` | +|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` | +|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and Left GUI and press `kc` | +|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` | +|`LCSG(kc)`| |Hold Left Control, Left Shift and Left GUI and press `kc` | +|`LCAG(kc)`| |Hold Left Control, Left Alt and Left GUI and press `kc` | +|`LSAG(kc)`| |Hold Left Shift, Left Alt and Left GUI and press `kc` | +|`RCTL(kc)`| |Hold Right Control and press `kc` | +|`RSFT(kc)`| |Hold Right Shift and press `kc` | +|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` | +|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` | +|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` | +|`RCA(kc)` | |Hold Right Control and Right Alt and press `kc` | +|`RCG(kc)` | |Hold Right Control and Right GUI and press `kc` | +|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt and press `kc` | +|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` | +|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` | +|`RCSG(kc)`| |Hold Right Control, Right Shift and Right GUI and press `kc` | +|`RCAG(kc)`| |Hold Right Control, Right Alt and Right GUI and press `kc` | +|`RSAG(kc)`| |Hold Right Shift, Right Alt and Right GUI and press `kc` | +|`MEH(kc)` | |Hold Left Control, Left Shift and Left Alt and press `kc` | +|`HYPR(kc)`| |Hold Left Control, Left Shift, Left Alt and Left GUI and press `kc`| +|`KC_MEH` | |Left Control, Left Shift and Left Alt | +|`KC_HYPR` | |Left Control, Left Shift, Left Alt and Left GUI | ## Mod-Tap Keys {#mod-tap-keys} See also: [Mod-Tap](mod_tap) -|Key |Aliases |Description | -|-------------|-----------------------------------------------------------------|--------------------------------------------------------------| -|`MT(mod, kc)`| |`mod` when held, `kc` when tapped | -|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped | -|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped | -|`LALT_T(kc)` |`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped | -|`LGUI_T(kc)` |`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped | -|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped | -|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped | -|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt (AltGr) when held, `kc` when tapped | -|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped | -|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | -|`LAG_T(kc)` | |Left Alt and GUI when held, `kc` when tapped | -|`RSG_T(kc)` | |Right Shift and GUI when held, `kc` when tapped | -|`RAG_T(kc)` | |Right Alt and GUI when held, `kc` when tapped | -|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | -|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped | -|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt (AltGr) when held, `kc` when tapped | -|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped | -|`LCAG_T(kc)` | |Left Control, Alt and GUI when held, `kc` when tapped | -|`RCAG_T(kc)` | |Right Control, Alt and GUI when held, `kc` when tapped | -|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped | -|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped | -|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| +|Key |Aliases |Description | +|-------------|-----------------------------------------------------------------|---------------------------------------------------------------------------| +|`MT(mod, kc)`| |`mod` when held, `kc` when tapped | +|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped | +|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped | +|`LALT_T(kc)` |`ALT_T(kc)`, `LOPT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped | +|`LGUI_T(kc)` |`GUI_T(kc)`, `LCMD_T(kc)`, `LWIN_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped | +|`LCS_T(kc)` | |Left Control and Left Shift when held, `kc` when tapped | +|`LCA_T(kc)` | |Left Control and Left Alt when held, `kc` when tapped | +|`LCG_T(kc)` | |Left Control and Left GUI when held, `kc` when tapped | +|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped | +|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and Left GUI when held, `kc` when tapped | +|`LAG_T(kc)` | |Left Alt and Left GUI when held, `kc` when tapped | +|`LCSG_T(kc)` | |Left Control, Left Shift and Left GUI when held, `kc` when tapped | +|`LCAG_T(kc)` | |Left Control, Left Alt and Left GUI when held, `kc` when tapped | +|`LSAG_T(kc)` | |Left Shift, Left Alt and Left GUI when held, `kc` when tapped | +|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped | +|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped | +|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped | +|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped | +|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped | +|`RCA_T(kc)` | |Right Control and Right Alt when held, `kc` when tapped | +|`RCG_T(kc)` | |Right Control and Right GUI when held, `kc` when tapped | +|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt when held, `kc` when tapped | +|`RSG_T(kc)` | |Right Shift and Right GUI when held, `kc` when tapped | +|`RAG_T(kc)` | |Right Alt and Right GUI when held, `kc` when tapped | +|`RCSG_T(kc)` | |Right Control, Right Shift and Right GUI when held, `kc` when tapped | +|`RCAG_T(kc)` | |Right Control, Right Alt and Right GUI when held, `kc` when tapped | +|`RSAG_T(kc)` | |Right Shift, Right Alt and Right GUI when held, `kc` when tapped | +|`MEH_T(kc)` | |Left Control, Left Shift and Left Alt when held, `kc` when tapped | +|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Left Shift, Left Alt and Left GUI when held, `kc` when tapped| ## Tapping Term Keys {#tapping-term-keys} diff --git a/docs/mod_tap.md b/docs/mod_tap.md index 8b420d30b62..ebf79adb7f9 100644 --- a/docs/mod_tap.md +++ b/docs/mod_tap.md @@ -27,29 +27,38 @@ This key would activate Left Control and Left Shift when held, and send Escape w For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap: -|Key |Aliases |Description | -|------------|-----------------------------------------------------------------|--------------------------------------------------------------| -|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped | -|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped | -|`LALT_T(kc)`|`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped | -|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped | -|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped | -|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped | -|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped | -|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped | -|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | -|`LAG_T(kc)` | |Left Alt and GUI when held, `kc` when tapped | -|`RSG_T(kc)` | |Right Shift and GUI when held, `kc` when tapped | -|`RAG_T(kc)` | |Right Alt and GUI when held, `kc` when tapped | -|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | -|`LSA_T(kc)` | |Left Shift and Alt when held, `kc` when tapped | -|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt (AltGr) when held, `kc` when tapped | -|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped | -|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped | -|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped | -|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped | -|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped | -|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)| +|Key |Aliases |Description | +|------------|-----------------------------------------------------------------|---------------------------------------------------------------------------------------| +|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped | +|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped | +|`LALT_T(kc)`|`ALT_T(kc)`, `LOPT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped | +|`LGUI_T(kc)`|`GUI_T(kc)`, `LCMD_T(kc)`, `LWIN_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped | +|`LCS_T(kc)` | |Left Control and Left Shift when held, `kc` when tapped | +|`LCA_T(kc)` | |Left Control and Left Alt when held, `kc` when tapped | +|`LCG_T(kc)` | |Left Control and Left GUI when held, `kc` when tapped | +|`LSA_T(kc)` | |Left Shift and Left Alt when held, `kc` when tapped | +|`LSG_T(kc)` |`SGUI_T(kc)`, `SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and Left GUI when held, `kc` when tapped | +|`LAG_T(kc)` | |Left Alt and Left GUI when held, `kc` when tapped | +|`LCSG_T(kc)`| |Left Control, Left Shift and Left GUI when held, `kc` when tapped | +|`LCAG_T(kc)`| |Left Control, Left Alt and Left GUI when held, `kc` when tapped | +|`LSAG_T(kc)`| |Left Shift, Left Alt and Left GUI when held, `kc` when tapped | +|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped | +|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped | +|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped | +|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped | +|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped | +|`RCA_T(kc)` | |Right Control and Right Alt when held, `kc` when tapped | +|`RCG_T(kc)` | |Right Control and Right GUI when held, `kc` when tapped | +|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt when held, `kc` when tapped | +|`RSG_T(kc)` | |Right Shift and Right GUI when held, `kc` when tapped | +|`RAG_T(kc)` | |Right Alt and Right GUI when held, `kc` when tapped | +|`RCSG_T(kc)`| |Right Control, Right Shift and Right GUI when held, `kc` when tapped | +|`RCAG_T(kc)`| |Right Control, Right Alt and Right GUI when held, `kc` when tapped | +|`RSAG_T(kc)`| |Right Shift, Right Alt and Right GUI when held, `kc` when tapped | +|`MEH_T(kc)` | |Left Control, Left Shift and Left Alt when held, `kc` when tapped | +|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Left Shift, Left Alt and Left GUI when held, `kc` when tapped1| + +1. More information on the Hyper key can be found on [this blog post by Brett Terpstra](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/). ## Caveats diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index bcaf94af8b9..a2a86e175cf 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -41,44 +41,59 @@ #define QK_MODS_GET_MODS(kc) (((kc) >> 8) & 0x1F) #define QK_MODS_GET_BASIC_KEYCODE(kc) ((kc)&0xFF) -// Keycode modifiers & aliases +// Modified keycodes #define LCTL(kc) (QK_LCTL | (kc)) #define LSFT(kc) (QK_LSFT | (kc)) #define LALT(kc) (QK_LALT | (kc)) #define LGUI(kc) (QK_LGUI | (kc)) + #define LOPT(kc) LALT(kc) #define LCMD(kc) LGUI(kc) #define LWIN(kc) LGUI(kc) + +#define C(kc) LCTL(kc) +#define S(kc) LSFT(kc) +#define A(kc) LALT(kc) +#define G(kc) LGUI(kc) + +#define LCS(kc) (QK_LCTL | QK_LSFT | (kc)) +#define LCA(kc) (QK_LCTL | QK_LALT | (kc)) +#define LCG(kc) (QK_LCTL | QK_LGUI | (kc)) +#define LSA(kc) (QK_LSFT | QK_LALT | (kc)) +#define LSG(kc) (QK_LSFT | QK_LGUI | (kc)) +#define LAG(kc) (QK_LALT | QK_LGUI | (kc)) +#define LCSG(kc) (QK_LCTL | QK_LSFT | QK_LGUI | (kc)) +#define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc)) +#define LSAG(kc) (QK_LSFT | QK_LALT | QK_LGUI | (kc)) + +#define SGUI(kc) LSG(kc) +#define SCMD(kc) LSG(kc) +#define SWIN(kc) LSG(kc) + #define RCTL(kc) (QK_RCTL | (kc)) #define RSFT(kc) (QK_RSFT | (kc)) #define RALT(kc) (QK_RALT | (kc)) #define RGUI(kc) (QK_RGUI | (kc)) + #define ALGR(kc) RALT(kc) #define ROPT(kc) RALT(kc) #define RCMD(kc) RGUI(kc) #define RWIN(kc) RGUI(kc) -#define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc)) -#define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc)) -#define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc)) -#define LSG(kc) (QK_LSFT | QK_LGUI | (kc)) -#define SGUI(kc) LSG(kc) -#define SCMD(kc) LSG(kc) -#define SWIN(kc) LSG(kc) -#define LAG(kc) (QK_LALT | QK_LGUI | (kc)) +#define RCA(kc) (QK_RCTL | QK_RALT | (kc)) +#define RCS(kc) (QK_RCTL | QK_RSFT | (kc)) +#define RCG(kc) (QK_RCTL | QK_RGUI | (kc)) +#define RSA(kc) (QK_RSFT | QK_RALT | (kc)) #define RSG(kc) (QK_RSFT | QK_RGUI | (kc)) #define RAG(kc) (QK_RALT | QK_RGUI | (kc)) -#define LCA(kc) (QK_LCTL | QK_LALT | (kc)) -#define LSA(kc) (QK_LSFT | QK_LALT | (kc)) -#define RSA(kc) (QK_RSFT | QK_RALT | (kc)) -#define RCS(kc) (QK_RCTL | QK_RSFT | (kc)) +#define RCSG(kc) (QK_RCTL | QK_RSFT | QK_RGUI | (kc)) +#define RCAG(kc) (QK_RCTL | QK_RALT | QK_RGUI | (kc)) +#define RSAG(kc) (QK_RSFT | QK_RALT | QK_RGUI | (kc)) + #define SAGR(kc) RSA(kc) -// Modified keycode aliases -#define C(kc) LCTL(kc) -#define S(kc) LSFT(kc) -#define A(kc) LALT(kc) -#define G(kc) LGUI(kc) +#define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc)) +#define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc)) // GOTO layer - 32 layer max #define TO(layer) (QK_TO | ((layer)&0x1F)) @@ -127,50 +142,63 @@ #define QK_MOD_TAP_GET_MODS(kc) (((kc) >> 8) & 0x1F) #define QK_MOD_TAP_GET_TAP_KEYCODE(kc) ((kc)&0xFF) +// Mod-Tap shortcuts #define LCTL_T(kc) MT(MOD_LCTL, kc) -#define RCTL_T(kc) MT(MOD_RCTL, kc) -#define CTL_T(kc) LCTL_T(kc) - #define LSFT_T(kc) MT(MOD_LSFT, kc) -#define RSFT_T(kc) MT(MOD_RSFT, kc) -#define SFT_T(kc) LSFT_T(kc) - #define LALT_T(kc) MT(MOD_LALT, kc) -#define RALT_T(kc) MT(MOD_RALT, kc) -#define LOPT_T(kc) LALT_T(kc) -#define ROPT_T(kc) RALT_T(kc) -#define ALGR_T(kc) RALT_T(kc) -#define ALT_T(kc) LALT_T(kc) -#define OPT_T(kc) LOPT_T(kc) - #define LGUI_T(kc) MT(MOD_LGUI, kc) -#define RGUI_T(kc) MT(MOD_RGUI, kc) + +#define CTL_T(kc) LCTL_T(kc) +#define SFT_T(kc) LSFT_T(kc) +#define ALT_T(kc) LALT_T(kc) +#define GUI_T(kc) LGUI_T(kc) + +#define LOPT_T(kc) LALT_T(kc) #define LCMD_T(kc) LGUI_T(kc) #define LWIN_T(kc) LGUI_T(kc) -#define RCMD_T(kc) RGUI_T(kc) -#define RWIN_T(kc) RGUI_T(kc) -#define GUI_T(kc) LGUI_T(kc) + +#define OPT_T(kc) LOPT_T(kc) #define CMD_T(kc) LCMD_T(kc) #define WIN_T(kc) LWIN_T(kc) -#define C_S_T(kc) MT(MOD_LCTL | MOD_LSFT, kc) // Left Control + Shift e.g. for gnome-terminal -#define MEH_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT, kc) // Meh is a less hyper version of the Hyper key -- doesn't include GUI, so just Left Control + Shift + Alt -#define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc) // Left Control + Alt + GUI -#define RCAG_T(kc) MT(MOD_RCTL | MOD_RALT | MOD_RGUI, kc) // Right Control + Alt + GUI -#define HYPR_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ -#define LSG_T(kc) MT(MOD_LSFT | MOD_LGUI, kc) // Left Shift + GUI +#define LCS_T(kc) MT(MOD_LCTL | MOD_LSFT, kc) +#define LCA_T(kc) MT(MOD_LCTL | MOD_LALT, kc) +#define LCG_T(kc) MT(MOD_LCTL | MOD_LGUI, kc) +#define LSA_T(kc) MT(MOD_LSFT | MOD_LALT, kc) +#define LSG_T(kc) MT(MOD_LSFT | MOD_LGUI, kc) +#define LAG_T(kc) MT(MOD_LALT | MOD_LGUI, kc) +#define LCSG_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LGUI, kc) +#define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc) +#define LSAG_T(kc) MT(MOD_LSFT | MOD_LALT | MOD_LGUI, kc) + #define SGUI_T(kc) LSG_T(kc) #define SCMD_T(kc) LSG_T(kc) #define SWIN_T(kc) LSG_T(kc) -#define LAG_T(kc) MT(MOD_LALT | MOD_LGUI, kc) // Left Alt + GUI -#define RSG_T(kc) MT(MOD_RSFT | MOD_RGUI, kc) // Right Shift + GUI -#define RAG_T(kc) MT(MOD_RALT | MOD_RGUI, kc) // Right Alt + GUI -#define LCA_T(kc) MT(MOD_LCTL | MOD_LALT, kc) // Left Control + Alt -#define LSA_T(kc) MT(MOD_LSFT | MOD_LALT, kc) // Left Shift + Alt -#define RSA_T(kc) MT(MOD_RSFT | MOD_RALT, kc) // Right Shift + Alt -#define RCS_T(kc) MT(MOD_RCTL | MOD_RSFT, kc) // Right Control + Shift + +#define RCTL_T(kc) MT(MOD_RCTL, kc) +#define RSFT_T(kc) MT(MOD_RSFT, kc) +#define RALT_T(kc) MT(MOD_RALT, kc) +#define RGUI_T(kc) MT(MOD_RGUI, kc) + +#define ROPT_T(kc) RALT_T(kc) +#define ALGR_T(kc) RALT_T(kc) +#define RCMD_T(kc) RGUI_T(kc) +#define RWIN_T(kc) RGUI_T(kc) + +#define RCS_T(kc) MT(MOD_RCTL | MOD_RSFT, kc) +#define RCA_T(kc) MT(MOD_RCTL | MOD_RALT, kc) +#define RCG_T(kc) MT(MOD_RCTL | MOD_RGUI, kc) +#define RSA_T(kc) MT(MOD_RSFT | MOD_RALT, kc) +#define RSG_T(kc) MT(MOD_RSFT | MOD_RGUI, kc) +#define RAG_T(kc) MT(MOD_RALT | MOD_RGUI, kc) +#define RCSG_T(kc) MT(MOD_RCTL | MOD_RSFT | MOD_RGUI, kc) +#define RCAG_T(kc) MT(MOD_RCTL | MOD_RALT | MOD_RGUI, kc) +#define RSAG_T(kc) MT(MOD_RSFT | MOD_RALT | MOD_RGUI, kc) + #define SAGR_T(kc) RSA_T(kc) +#define MEH_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT, kc) +#define HYPR_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc) #define ALL_T(kc) HYPR_T(kc) // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap diff --git a/quantum/quantum_keycodes_legacy.h b/quantum/quantum_keycodes_legacy.h index 21aec90675a..55b0fc35966 100644 --- a/quantum/quantum_keycodes_legacy.h +++ b/quantum/quantum_keycodes_legacy.h @@ -57,3 +57,5 @@ #define KC_ACL2 QK_MOUSE_ACCELERATION_2 #define QK_OUTPUT_AUTO OU_AUTO + +#define C_S_T(kc) LCS_T(kc) From b42191a2dda9b52470c1fd8cca341fe5f7ca0576 Mon Sep 17 00:00:00 2001 From: Pascal Getreuer <50221757+getreuer@users.noreply.github.com> Date: Fri, 27 Jun 2025 20:21:12 -0700 Subject: [PATCH 17/37] [Docs] Fix typo in Chordal Hold example JSON, comma to colon. (#25424) --- docs/tap_hold.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tap_hold.md b/docs/tap_hold.md index 55cb64a498e..164be229f62 100644 --- a/docs/tap_hold.md +++ b/docs/tap_hold.md @@ -602,7 +602,7 @@ either `"L"`, `"R"`, or `"*"`. Note that if `"layouts"` contains multiple layouts, only the first one is read. For example: ```json -{"matrix": [5, 6], "x": 0, "y": 5.5, "w": 1.25, "hand", "*"}, +{"matrix": [5, 6], "x": 0, "y": 5.5, "w": 1.25, "hand": "*"}, ``` Alternatively, handedness may be defined functionally with From 177e461d903e6414e6d7b5b80eb36f48b0d68626 Mon Sep 17 00:00:00 2001 From: Jon Henry Fernandez Date: Sat, 28 Jun 2025 11:29:57 -0500 Subject: [PATCH 18/37] [Keyboard] Add togkey pad & pad_plus (#25217) * Initial Commit for Adding TogKey Pad and TogKey Pad Plus to QMK * Added TogKey Pad default Keymap * Changed Pins for Encoder * added images to read me * Updated Read Me Pictures Links * Applied Suggested Changes and Formatting to keyboard.json * Applied suggested keycodes to keymap.c for togkey pad * Updated Hardware Availability Links in Readme * Set development board instead of seperate bootloader and processor. * Added pad_plus.c for oled. Added config.h for pad_plus. Applied Suggested Changes. * - Moved oled arrays outside of oled_task function. - Removed white spaces from pad_plus keymaps. - Made suggested changes to oled_task function. * Updated with Changes - Updated pad json. Removed extra features, remvoed rgb test from rgb animations. - Updated pad_plus functions - Updated Pad Plus Config file * Readded display defintion. * Corrected OLED resolution definition. * Applied Suggested Changes - Updated Copyright Information - Updated Layout Names - Updated TogKey Pad Layout * Applied Suggested Changes - Removed move layer function. - Repolaced with "TO" keycodes - Updated OLED images * Fixed Layout name in keyboard.json for togkey pad * - Updated Readme for both pad and pad plus. - Updated Oled pictures for pad plus. * - Added bootmagic and extrakey features to togkey pad keyboard.json. --- keyboards/togkey/pad/keyboard.json | 52 ++ keyboards/togkey/pad/keymaps/default/keymap.c | 11 + keyboards/togkey/pad/readme.md | 27 + keyboards/togkey/pad_plus/config.h | 10 + keyboards/togkey/pad_plus/keyboard.json | 63 ++ .../togkey/pad_plus/keymaps/default/keymap.c | 30 + keyboards/togkey/pad_plus/pad_plus.c | 731 ++++++++++++++++++ keyboards/togkey/pad_plus/readme.md | 27 + 8 files changed, 951 insertions(+) create mode 100644 keyboards/togkey/pad/keyboard.json create mode 100644 keyboards/togkey/pad/keymaps/default/keymap.c create mode 100644 keyboards/togkey/pad/readme.md create mode 100644 keyboards/togkey/pad_plus/config.h create mode 100644 keyboards/togkey/pad_plus/keyboard.json create mode 100644 keyboards/togkey/pad_plus/keymaps/default/keymap.c create mode 100644 keyboards/togkey/pad_plus/pad_plus.c create mode 100644 keyboards/togkey/pad_plus/readme.md diff --git a/keyboards/togkey/pad/keyboard.json b/keyboards/togkey/pad/keyboard.json new file mode 100644 index 00000000000..f93346deb6a --- /dev/null +++ b/keyboards/togkey/pad/keyboard.json @@ -0,0 +1,52 @@ +{ + "manufacturer": "TogKey", + "keyboard_name": "Pad", + "maintainer": "togkey86", + "development_board": "promicro_rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["GP2", "GP3", "GP4"], + "rows": ["GP5", "GP6"] + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "hue_steps": 10, + "led_count": 5 + }, + "url": "https://togkey.com/products/togkey-pad", + "usb": { + "device_version": "1.0.0", + "pid": "0x8686", + "vid": "0xFEED" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP7" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0.5, "y": 0}, + {"matrix": [0, 1], "x": 1.5, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 2, "y": 1} + ] + } + } +} diff --git a/keyboards/togkey/pad/keymaps/default/keymap.c b/keyboards/togkey/pad/keymaps/default/keymap.c new file mode 100644 index 00000000000..4c55f41e69a --- /dev/null +++ b/keyboards/togkey/pad/keymaps/default/keymap.c @@ -0,0 +1,11 @@ +// Copyright 2025 TogKey +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_VOLD, KC_VOLU, + KC_MPRV, KC_MPLY, KC_MNXT + ) +}; diff --git a/keyboards/togkey/pad/readme.md b/keyboards/togkey/pad/readme.md new file mode 100644 index 00000000000..3c34876970e --- /dev/null +++ b/keyboards/togkey/pad/readme.md @@ -0,0 +1,27 @@ +# pad + +![pad](https://i.imgur.com/KMS1btN.jpeg) + +A simple 5-Key Macropad based off an RP2040 and custom PCB. + +* Keyboard Maintainer: [Jon Henry](https://github.com/togkey86) +* Hardware Supported: TogKey Pad PCB, RP2040 Pro Micro Development Board +* Hardware Availability: (https://togkey.com) + +Make example for this keyboard (after setting up your build environment): + + make togkey/pad:default + +Flashing example for this keyboard: + + make togkey/pad:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/togkey/pad_plus/config.h b/keyboards/togkey/pad_plus/config.h new file mode 100644 index 00000000000..525f02feb0c --- /dev/null +++ b/keyboards/togkey/pad_plus/config.h @@ -0,0 +1,10 @@ +// Copyright 2025 TogKey +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +//OLED +#define OLED_DISPLAY_128X64 +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP2 +#define I2C1_SCL_PIN GP3 diff --git a/keyboards/togkey/pad_plus/keyboard.json b/keyboards/togkey/pad_plus/keyboard.json new file mode 100644 index 00000000000..ca5eabf9026 --- /dev/null +++ b/keyboards/togkey/pad_plus/keyboard.json @@ -0,0 +1,63 @@ +{ + "manufacturer": "TogKey", + "keyboard_name": "Pad Plus", + "maintainer": "togkey86", + "development_board": "promicro_rp2040", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "GP28", "pin_b": "GP29", "resolution": 2} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "oled": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["GP4", "GP5", "GP6"], + "rows": ["GP26", "GP22", "GP20"] + }, + + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "hue_steps": 10, + "led_count": 3 + }, + "url": "https://togkey.com/products/togkey-pad-plus", + "usb": { + "device_version": "1.0.0", + "pid": "0x8687", + "vid": "0xFEED" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP27" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1}, + {"matrix": [1, 1], "x": 1, "y": 1}, + {"matrix": [1, 2], "x": 2, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2}, + {"matrix": [2, 1], "x": 1, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2} + ] + } + } +} diff --git a/keyboards/togkey/pad_plus/keymaps/default/keymap.c b/keyboards/togkey/pad_plus/keymaps/default/keymap.c new file mode 100644 index 00000000000..3d1979b2e14 --- /dev/null +++ b/keyboards/togkey/pad_plus/keymaps/default/keymap.c @@ -0,0 +1,30 @@ +// Copyright 2025 TogKey +// SPDX-License-Identifier: GPL-2.0-or-later6 + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + TO(1), + KC_VOLD, KC_MUTE, KC_VOLU, + KC_MPRV, KC_MPLY, KC_MNXT + ), + + [1] = LAYOUT( + TO(2), + KC_1, KC_2, KC_3, + KC_4, KC_5, KC_6 + ), + + [2] = LAYOUT( + TO(3), + KC_A, KC_B, KC_C, + KC_D, KC_E, KC_F + ), + + [3] = LAYOUT( + TO(0), + KC_J, KC_K, KC_L, + KC_M, KC_N, KC_O + ) +}; diff --git a/keyboards/togkey/pad_plus/pad_plus.c b/keyboards/togkey/pad_plus/pad_plus.c new file mode 100644 index 00000000000..c1db5edfe60 --- /dev/null +++ b/keyboards/togkey/pad_plus/pad_plus.c @@ -0,0 +1,731 @@ +// Copyright 2025 TogKey +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "quantum.h" + +#if defined(OLED_ENABLE) +oled_rotation_t oled_init_kb(oled_rotation_t rotation) { + return OLED_ROTATION_180; +} + +static const char image_layer_1[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0x8F, 0x8F, 0x70, 0xFC, 0xFE, 0xFE, + 0xCF, 0x8F, 0x8F, 0x8F, 0xFE, 0xFE, + 0xFC, 0x78, 0xF8, 0xFC, 0xFE, 0xFF, + 0x8F, 0x8F, 0x8F, 0xCE, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xFC, 0xFE, 0xDF, 0x8F, + 0x07, 0x23, 0xFC, 0xFE, 0xFE, 0xFF, + 0xB7, 0xB7, 0xBF, 0xBE, 0xBE, 0xB8, + 0x07, 0x1F, 0x3F, 0xFE, 0xFC, 0xF0, + 0xF0, 0xFE, 0xFF, 0x3F, 0x0F, 0x03, + 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x03, 0x07, 0x07, 0x03, 0x00, 0x01, + 0x03, 0x03, 0x03, 0x07, 0x07, 0x03, + 0x03, 0x03, 0x01, 0x00, 0x00, 0x39, + 0x7B, 0x7B, 0x77, 0x77, 0x73, 0x7B, + 0x7F, 0x3F, 0x1F, 0x07, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x02, 0x00, 0x01, + 0x03, 0x03, 0x07, 0x07, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x60, 0x78, 0x7E, + 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x07, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, + 0x78, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0xF0, + 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xF0, 0xF0, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x78, 0xF0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xBF, 0x9F, 0xDF, 0x0F, + 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, + 0x30, 0x30, 0x30, 0xF0, 0xF0, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x70, 0x70, 0x30, 0x30, 0xF0, + 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, + 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBF, + 0xBF, 0x80, 0x80, 0xBF, 0xBF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xF0, 0xF8, 0xFC, 0xEE, 0xEF, 0xE7, + 0xE3, 0xC1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x70, 0xE7, 0xE7, + 0xE7, 0xEF, 0xFF, 0x7C, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1F, + 0x1F, 0x1B, 0x18, 0xFF, 0xFF, 0x7F, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, + 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x7F, 0xFF, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0x7F, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0x7F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +static const char image_layer_2[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0x8F, 0x8F, 0x70, 0xFC, 0xFE, 0xFE, + 0xCF, 0x8F, 0x8F, 0x8F, 0xFE, 0xFE, + 0xFC, 0x78, 0xF8, 0xFC, 0xFE, 0xFF, + 0x8F, 0x8F, 0x8F, 0xCE, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xFC, 0xFE, 0xDF, 0x8F, + 0x07, 0x23, 0xFC, 0xFE, 0xFE, 0xFF, + 0xB7, 0xB7, 0xBF, 0xBE, 0xBE, 0xB8, + 0x07, 0x1F, 0x3F, 0xFE, 0xFC, 0xF0, + 0xF0, 0xFE, 0xFF, 0x3F, 0x0F, 0x03, + 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x03, 0x07, 0x07, 0x03, 0x00, 0x01, + 0x03, 0x03, 0x03, 0x07, 0x07, 0x03, + 0x03, 0x03, 0x01, 0x00, 0x00, 0x39, + 0x7B, 0x7B, 0x77, 0x77, 0x73, 0x7B, + 0x7F, 0x3F, 0x1F, 0x07, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x02, 0x00, 0x01, + 0x03, 0x03, 0x07, 0x07, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x60, 0x78, 0x7E, + 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x07, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xF8, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, + 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xF0, 0xF0, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x78, 0xF0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x60, 0xF0, 0xF0, + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDF, + 0xCF, 0xCF, 0xCF, 0x1F, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x70, 0x70, 0x30, 0x30, 0xF0, + 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, + 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, + 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x9F, 0x87, 0xB7, 0xB3, 0xB9, 0xBC, + 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x70, 0xE7, 0xE7, + 0xE7, 0xEF, 0xFF, 0x7C, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1F, + 0x1F, 0x1B, 0x18, 0xFF, 0xFF, 0x7F, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x7F, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x7F, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x7F, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x7F, 0xFF, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0x7F, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0x7F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +static const char image_layer_3[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0x8F, 0x8F, 0x70, 0xFC, 0xFE, 0xFE, + 0xCF, 0x8F, 0x8F, 0x8F, 0xFE, 0xFE, + 0xFC, 0x78, 0xF8, 0xFC, 0xFE, 0xFF, + 0x8F, 0x8F, 0x8F, 0xCE, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xFC, 0xFE, 0xDF, 0x8F, + 0x07, 0x23, 0xFC, 0xFE, 0xFE, 0xFF, + 0xB7, 0xB7, 0xBF, 0xBE, 0xBE, 0xB8, + 0x07, 0x1F, 0x3F, 0xFE, 0xFC, 0xF0, + 0xF0, 0xFE, 0xFF, 0x3F, 0x0F, 0x03, + 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x03, 0x07, 0x07, 0x03, 0x00, 0x01, + 0x03, 0x03, 0x03, 0x07, 0x07, 0x03, + 0x03, 0x03, 0x01, 0x00, 0x00, 0x39, + 0x7B, 0x7B, 0x77, 0x77, 0x73, 0x7B, + 0x7F, 0x3F, 0x1F, 0x07, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x02, 0x00, 0x01, + 0x03, 0x03, 0x07, 0x07, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x60, 0x78, 0x7E, + 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x07, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xF8, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, + 0x78, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0xF0, + 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x60, 0xF0, 0xF0, + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, + 0x30, 0x30, 0x30, 0xF0, 0xF0, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x9F, 0xDF, 0xEF, 0xCF, 0xCF, + 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, + 0xF0, 0xF0, 0xF0, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, + 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xF0, 0xF8, 0xFC, 0xEE, 0xEF, 0xE7, + 0xE3, 0xC1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xDF, 0x8F, 0xBF, 0xBD, + 0xBD, 0xB8, 0x82, 0xC7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1F, + 0x1F, 0x1B, 0x18, 0xFF, 0xFF, 0x7F, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x7F, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x7F, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, + 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, 0x7F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +static const char image_layer_4[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0x8F, 0x8F, 0x70, 0xFC, 0xFE, 0xFE, + 0xCF, 0x8F, 0x8F, 0x8F, 0xFE, 0xFE, + 0xFC, 0x78, 0xF8, 0xFC, 0xFE, 0xFF, + 0x8F, 0x8F, 0x8F, 0xCE, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0xFC, 0xFE, 0xDF, 0x8F, + 0x07, 0x23, 0xFC, 0xFE, 0xFE, 0xFF, + 0xB7, 0xB7, 0xBF, 0xBE, 0xBE, 0xB8, + 0x07, 0x1F, 0x3F, 0xFE, 0xFC, 0xF0, + 0xF0, 0xFE, 0xFF, 0x3F, 0x0F, 0x03, + 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x03, 0x07, 0x07, 0x03, 0x00, 0x01, + 0x03, 0x03, 0x03, 0x07, 0x07, 0x03, + 0x03, 0x03, 0x01, 0x00, 0x00, 0x39, + 0x7B, 0x7B, 0x77, 0x77, 0x73, 0x7B, + 0x7F, 0x3F, 0x1F, 0x07, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x00, 0x01, 0x03, + 0x03, 0x03, 0x03, 0x02, 0x00, 0x01, + 0x03, 0x03, 0x07, 0x07, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x60, 0x78, 0x7E, + 0x7F, 0x3F, 0x0F, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x07, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xF8, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0xF8, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, + 0x78, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0xF0, + 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xF0, 0xF0, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x78, 0xF0, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, + 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x60, 0x60, 0xF0, 0xF0, + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, + 0x30, 0x30, 0x30, 0xF0, 0xF0, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x70, 0x70, 0x30, 0x30, 0xF0, + 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0x9F, 0x0F, 0x0F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, + 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xF0, 0xF8, 0xFC, 0xEE, 0xEF, 0xE7, + 0xE3, 0xC1, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x70, 0xE7, 0xE7, + 0xE7, 0xEF, 0xFF, 0x7C, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE1, + 0xE4, 0xEF, 0xEF, 0x80, 0x80, 0xE7, + 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x7F, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x7F, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xFF, + 0x7F, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x7F, 0xFF, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0x7F, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +bool oled_task_kb(void) { + if (!oled_task_user()) { + return false; + } + + switch (get_highest_layer(layer_state)) { + case 0: + oled_write_raw_P(image_layer_1, sizeof(image_layer_1)); + break; + case 1: + oled_write_raw_P(image_layer_2, sizeof(image_layer_2)); + break; + case 2: + oled_write_raw_P(image_layer_3, sizeof(image_layer_3)); + break; + case 3: + oled_write_raw_P(image_layer_4, sizeof(image_layer_4)); + break; + default: + oled_write_ln_P(PSTR("Undefined"), false); + } + + return false; +} +#endif diff --git a/keyboards/togkey/pad_plus/readme.md b/keyboards/togkey/pad_plus/readme.md new file mode 100644 index 00000000000..99512f07e7c --- /dev/null +++ b/keyboards/togkey/pad_plus/readme.md @@ -0,0 +1,27 @@ +# pad_plus + +![pad_plus](https://i.imgur.com/9g3gNMZ.jpeg) + +A 6-Key Macropad featuring a Oled Screen and Rotary Encoder based off an RP2040 and custom PCB. + +* Keyboard Maintainer: [Jon Henry](https://github.com/togkey86) +* Hardware Supported: TogKey Pad Plus PCB, RP2040 Development Board +* Hardware Availability: (https://togkey.com) + +Make example for this keyboard (after setting up your build environment): + + make togkey/pad_plus:default + +Flashing example for this keyboard: + + make togkey/pad_plus:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 9e103614f8aa7420305f11b8b3fd3038d0656121 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Fri, 4 Jul 2025 20:09:27 +0100 Subject: [PATCH 19/37] Fix invalid layer API usage in RGB Matrix docs (#25449) --- docs/features/rgb_matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/rgb_matrix.md b/docs/features/rgb_matrix.md index ca50fc52572..130c1c5a5eb 100644 --- a/docs/features/rgb_matrix.md +++ b/docs/features/rgb_matrix.md @@ -486,7 +486,7 @@ This example sets the modifiers to be a specific color based on the layer state. bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { hsv_t hsv = {0, 255, 255}; - if (layer_state_is(layer_state, 2)) { + if (get_highest_layer(layer_state|default_layer_state) == 2) { hsv = (hsv_t){130, 255, 255}; } else { hsv = (hsv_t){30, 255, 255}; From da7811f82aad8997495750c9ef70117f9934f340 Mon Sep 17 00:00:00 2001 From: SneakboxKB <67670271+SneakboxKB@users.noreply.github.com> Date: Sun, 6 Jul 2025 00:59:20 -0500 Subject: [PATCH 20/37] Add lilBAE support (#25259) --- keyboards/sneakbox/lilbae/keyboard.json | 69 +++++++++++++++++++ .../lilbae/keymaps/ansi_enter/keymap.c | 29 ++++++++ .../sneakbox/lilbae/keymaps/default/keymap.c | 28 ++++++++ .../sneakbox/lilbae/keymaps/iso/keymap.c | 35 ++++++++++ .../sneakbox/lilbae/keymaps/iso/rules.mk | 1 + .../lilbae/keymaps/split_ansi_enter/keymap.c | 35 ++++++++++ .../lilbae/keymaps/split_ansi_enter/rules.mk | 1 + keyboards/sneakbox/lilbae/readme.md | 27 ++++++++ 8 files changed, 225 insertions(+) create mode 100644 keyboards/sneakbox/lilbae/keyboard.json create mode 100644 keyboards/sneakbox/lilbae/keymaps/ansi_enter/keymap.c create mode 100644 keyboards/sneakbox/lilbae/keymaps/default/keymap.c create mode 100644 keyboards/sneakbox/lilbae/keymaps/iso/keymap.c create mode 100644 keyboards/sneakbox/lilbae/keymaps/iso/rules.mk create mode 100644 keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/keymap.c create mode 100644 keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/rules.mk create mode 100644 keyboards/sneakbox/lilbae/readme.md diff --git a/keyboards/sneakbox/lilbae/keyboard.json b/keyboards/sneakbox/lilbae/keyboard.json new file mode 100644 index 00000000000..b1aa92cb683 --- /dev/null +++ b/keyboards/sneakbox/lilbae/keyboard.json @@ -0,0 +1,69 @@ +{ + "keyboard_name": "Lil' BAE", + "manufacturer": "Sneakbox", + "maintainer": "mujimanic", + "bootloader": "atmel-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "D2", "pin_b": "D3"} + ] + }, + "bootmagic": { + "matrix": [0, 2] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "cols": ["B7", "D4", "D5", "D6"], + "rows": ["B4"] + }, + "processor": "atmega32u2", + "url": "https://sneakbox.com", + "usb": { + "device_version": "0.0.1", + "pid": "0x0012", + "vid": "0x5342" + }, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 1.75, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 0, "y": 1}, + {"matrix": [0, 2], "x": 1, "y": 1}, + {"matrix": [0, 3], "x": 2, "y": 1, "w": 1.25} + ] + }, + "LAYOUT_ansi_enter": { + "layout": [ + {"matrix": [0, 0], "x": 0.75, "y": 0, "w": 1.5}, + {"matrix": [0, 2], "x": 0, "y": 1, "w": 2.25} + ] + }, + "LAYOUT_bae": { + "layout": [ + {"matrix": [0, 2], "x": 0, "y": 0, "w": 2.25, "h": 2} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"matrix": [0, 0], "x": 1, "y": 0, "w": 1.25, "h": 2}, + {"matrix": [0, 1], "x": 0, "y": 1} + ] + }, + "LAYOUT_split_ansi_enter": { + "layout": [ + {"matrix": [0, 0], "x": 0.75, "y": 0, "w": 1.5}, + {"matrix": [0, 1], "x": 0, "y": 1}, + {"matrix": [0, 3], "x": 1, "y": 1, "w": 1.25} + ] + } + } +} diff --git a/keyboards/sneakbox/lilbae/keymaps/ansi_enter/keymap.c b/keyboards/sneakbox/lilbae/keymaps/ansi_enter/keymap.c new file mode 100644 index 00000000000..775d33ff15c --- /dev/null +++ b/keyboards/sneakbox/lilbae/keymaps/ansi_enter/keymap.c @@ -0,0 +1,29 @@ +/* +Copyright 2022 Bryan Ong + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_ansi_enter( + KC_BSLS, + KC_ENT) +}; diff --git a/keyboards/sneakbox/lilbae/keymaps/default/keymap.c b/keyboards/sneakbox/lilbae/keymaps/default/keymap.c new file mode 100644 index 00000000000..4a4f4c80a60 --- /dev/null +++ b/keyboards/sneakbox/lilbae/keymaps/default/keymap.c @@ -0,0 +1,28 @@ +/* +Copyright 2022 Bryan Ong + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_bae( + KC_ENT) +}; diff --git a/keyboards/sneakbox/lilbae/keymaps/iso/keymap.c b/keyboards/sneakbox/lilbae/keymaps/iso/keymap.c new file mode 100644 index 00000000000..3f15660c07b --- /dev/null +++ b/keyboards/sneakbox/lilbae/keymaps/iso/keymap.c @@ -0,0 +1,35 @@ +/* +Copyright 2022 Bryan Ong + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_iso( + KC_ENT, + KC_UNDO ) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = { ENCODER_CCW_CW(KC_1, KC_2)} +}; +#endif diff --git a/keyboards/sneakbox/lilbae/keymaps/iso/rules.mk b/keyboards/sneakbox/lilbae/keymaps/iso/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/sneakbox/lilbae/keymaps/iso/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/keymap.c b/keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/keymap.c new file mode 100644 index 00000000000..00d44fb9354 --- /dev/null +++ b/keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/keymap.c @@ -0,0 +1,35 @@ +/* +Copyright 2022 Bryan Ong + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _BASE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_split_ansi_enter( + KC_BSLS, + KC_UNDO, KC_LGUI) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = { ENCODER_CCW_CW(KC_1, KC_2)} +}; +#endif diff --git a/keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/rules.mk b/keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/sneakbox/lilbae/keymaps/split_ansi_enter/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/sneakbox/lilbae/readme.md b/keyboards/sneakbox/lilbae/readme.md new file mode 100644 index 00000000000..f637df1c1b3 --- /dev/null +++ b/keyboards/sneakbox/lilbae/readme.md @@ -0,0 +1,27 @@ +# Sneakbox Lil' BAE + +![Lil' BAE](https://i.imgur.com/WGNgOhM.jpeg) + +A small macropad featuring key positions for a Big-Ass Enter (Reverse L-shaped enter key) + +Keyboard Maintainer: [mujimanic](https://sneakbox.com) +Hardware Supported: Lil' BAE Case +Hardware Availability: [sneakbox.design](https://sneakbox.com/products/lil-bae-macropad) + +Make example for this keyboard (after setting up your build environment): + + make sneakbox/lilbae:default + +Flashing example for this keyboard: + + make sneakbox/lilbae:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,2) in the matrix (position mapped to ANSI enter key) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 90b5c170347e7a46a8f56628a9830ea5a719a326 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 6 Jul 2025 07:20:48 +0100 Subject: [PATCH 21/37] Fix SPI bus lock issue in spi_start_extended when using mutual exclusion (#25447) --- platforms/chibios/drivers/spi_master.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/platforms/chibios/drivers/spi_master.c b/platforms/chibios/drivers/spi_master.c index f5e48edfda5..84d027bf49d 100644 --- a/platforms/chibios/drivers/spi_master.c +++ b/platforms/chibios/drivers/spi_master.c @@ -130,10 +130,16 @@ bool spi_start_extended(spi_start_config_t *start_config) { #endif // (SPI_USE_MUTUAL_EXCLUSION == TRUE) if (spiStarted) { +#if (SPI_USE_MUTUAL_EXCLUSION == TRUE) + spiReleaseBus(&SPI_DRIVER); +#endif // (SPI_USE_MUTUAL_EXCLUSION == TRUE) return false; } #if SPI_SELECT_MODE != SPI_SELECT_MODE_NONE if (start_config->slave_pin == NO_PIN) { +# if (SPI_USE_MUTUAL_EXCLUSION == TRUE) + spiReleaseBus(&SPI_DRIVER); +# endif // (SPI_USE_MUTUAL_EXCLUSION == TRUE) return false; } #endif @@ -146,10 +152,16 @@ bool spi_start_extended(spi_start_config_t *start_config) { # if defined(AT32F415) if (roundedDivisor < 2 || roundedDivisor > 1024) { +# if (SPI_USE_MUTUAL_EXCLUSION == TRUE) + spiReleaseBus(&SPI_DRIVER); +# endif // (SPI_USE_MUTUAL_EXCLUSION == TRUE) return false; } # else if (roundedDivisor < 2 || roundedDivisor > 256) { +# if (SPI_USE_MUTUAL_EXCLUSION == TRUE) + spiReleaseBus(&SPI_DRIVER); +# endif // (SPI_USE_MUTUAL_EXCLUSION == TRUE) return false; } # endif @@ -234,6 +246,9 @@ bool spi_start_extended(spi_start_config_t *start_config) { } if (start_config->divisor < 1) { +# if (SPI_USE_MUTUAL_EXCLUSION == TRUE) + spiReleaseBus(&SPI_DRIVER); +# endif // (SPI_USE_MUTUAL_EXCLUSION == TRUE) return false; } From ba63bac661c3c6154f3b42a85167b3552d29f0f8 Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 6 Jul 2025 16:57:51 +1000 Subject: [PATCH 22/37] Add short aliases for `OSM()` (#25443) --- docs/keycodes.md | 43 +++++++++++++++++++++++++++------- docs/one_shot_keys.md | 48 ++++++++++++++++++++++++++++++++++---- quantum/quantum_keycodes.h | 35 +++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 13 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index 5d983e347ef..33014a54a5a 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -404,7 +404,6 @@ See also: [Layer Switching](feature_layers#switching-and-toggling-layers) |`DF(layer)` |Set the base (default) layer until the keyboard loses power | |`PDF(layer)` |Set the base (default) layer in EEPROM | |`MO(layer)` |Momentarily turn on `layer` when pressed (requires `KC_TRNS` on destination layer)| -|`OSL(layer)` |Momentarily activates `layer` until a key is pressed. See [One Shot Keys](one_shot_keys) for details. | |`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. Where `mod` is a mods_bit. Mods can be viewed [here](mod_tap). Example Implementation: `LM(LAYER_1, MOD_LALT)`| |`LT(layer, kc)` |Turn on `layer` when held, `kc` when tapped | |`TG(layer)` |Toggle `layer` on or off | @@ -817,13 +816,41 @@ See also: [US ANSI Shifted Symbols](keycodes_us_ansi_shifted) See also: [One Shot Keys](one_shot_keys) -|Key |Aliases |Description | -|--------------------|---------|----------------------------------| -|`OSM(mod)` | |Hold `mod` for one keypress | -|`OSL(layer)` | |Switch to `layer` for one keypress| -|`QK_ONE_SHOT_TOGGLE`|`OS_TOGG`|Toggles One Shot keys status | -|`QK_ONE_SHOT_ON` |`OS_ON` |Turns One Shot keys on | -|`QK_ONE_SHOT_OFF` |`OS_OFF` |Turns One Shot keys off | +|Key |Aliases |Description | +|--------------------|---------|---------------------------------------------------------------------| +|`QK_ONE_SHOT_TOGGLE`|`OS_TOGG`|Toggles One Shot keys status | +|`QK_ONE_SHOT_ON` |`OS_ON` |Turns One Shot keys on | +|`QK_ONE_SHOT_OFF` |`OS_OFF` |Turns One Shot keys off | +|`OSL(layer)` | |Switch to `layer` for one keypress | +|`OSM(mod)` | |Hold `mod` for one keypress | +|`OS_LCTL` | |Hold Left Control for one keypress | +|`OS_LSFT` | |Hold Left Shift for one keypress | +|`OS_LALT` | |Hold Left Alt for one keypress | +|`OS_LGUI` | |Hold Left GUI for one keypress | +|`OS_LCS` | |Hold Left Control and Left Shift for one keypress | +|`OS_LCA` | |Hold Left Control and left Alt for one keypress | +|`OS_LCG` | |Hold Left Control and Left GUI for one keypress | +|`OS_LSA` | |Hold Left Shift and Left Alt for one keypress | +|`OS_LSG` | |Hold Left Shift and Left GUI for one keypress | +|`OS_LAG` | |Hold Left Alt and Left GUI for one keypress | +|`OS_LCSG` | |Hold Left Control, Left Shift and Left GUI for one keypress | +|`OS_LCAG` | |Hold Left Control, Left Alt and Left GUI for one keypress | +|`OS_LSAG` | |Hold Left Shift, Left Alt and Left GUI for one keypress | +|`OS_RCTL` | |Hold Right Control for one keypress | +|`OS_RSFT` | |Hold Right Shift for one keypress | +|`OS_RALT` | |Hold Right Alt for one keypress | +|`OS_RGUI` | |Hold Right GUI for one keypress | +|`OS_RCS` | |Hold Right Control and Right Shift for one keypress | +|`OS_RCA` | |Hold Right Control and Right Alt for one keypress | +|`OS_RCG` | |Hold Right Control and Right GUI for one keypress | +|`OS_RSA` | |Hold Right Shift and Right Alt for one keypress | +|`OS_RSG` | |Hold Right Shift and Right GUI for one keypress | +|`OS_RAG` | |Hold Right Alt and Right GUI for one keypress | +|`OS_RCSG` | |Hold Right Control, Right Shift and Right GUI for one keypress | +|`OS_RCAG` | |Hold Right Control, Right Alt and Right GUI for one keypress | +|`OS_RSAG` | |Hold Right Shift, Right Alt and Right GUI for one keypress | +|`OS_MEH` | |Hold Left Control, Left Shift and Left Alt for one keypress | +|`OS_HYPR` | |Hold Left Control, Left Shift, Left Alt and Left GUI for one keypress| ## Programmable Button Support {#programmable-button} diff --git a/docs/one_shot_keys.md b/docs/one_shot_keys.md index 140c8de4754..c4d8e3a4bc8 100644 --- a/docs/one_shot_keys.md +++ b/docs/one_shot_keys.md @@ -15,11 +15,49 @@ You can control the behavior of one shot keys by defining these in `config.h`: #define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */ ``` -* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](mod_tap), not the `KC_*` codes. -* `OSL(layer)` - momentary switch to *layer*. -* `OS_ON` - Turns on One Shot keys. -* `OS_OFF` - Turns off One Shot keys. OSM act as regular mod keys, OSL act like `MO`. -* `OS_TOGG` - Toggles the one shot key status. +## Keycodes {#keycodes} + +|Key |Aliases |Description | +|--------------------|---------|---------------------------------------------------------------------| +|`QK_ONE_SHOT_TOGGLE`|`OS_TOGG`|Toggles One Shot keys status | +|`QK_ONE_SHOT_ON` |`OS_ON` |Turns One Shot keys on | +|`QK_ONE_SHOT_OFF` |`OS_OFF` |Turns One Shot keys off | +|`OSL(layer)` | |Switch to `layer` for one keypress | +|`OSM(mod)` | |Hold `mod` for one keypress | +|`OS_LCTL` | |Hold Left Control for one keypress | +|`OS_LSFT` | |Hold Left Shift for one keypress | +|`OS_LALT` | |Hold Left Alt for one keypress | +|`OS_LGUI` | |Hold Left GUI for one keypress | +|`OS_LCS` | |Hold Left Control and Left Shift for one keypress | +|`OS_LCA` | |Hold Left Control and left Alt for one keypress | +|`OS_LCG` | |Hold Left Control and Left GUI for one keypress | +|`OS_LSA` | |Hold Left Shift and Left Alt for one keypress | +|`OS_LSG` | |Hold Left Shift and Left GUI for one keypress | +|`OS_LAG` | |Hold Left Alt and Left GUI for one keypress | +|`OS_LCSG` | |Hold Left Control, Left Shift and Left GUI for one keypress | +|`OS_LCAG` | |Hold Left Control, Left Alt and Left GUI for one keypress | +|`OS_LSAG` | |Hold Left Shift, Left Alt and Left GUI for one keypress | +|`OS_RCTL` | |Hold Right Control for one keypress | +|`OS_RSFT` | |Hold Right Shift for one keypress | +|`OS_RALT` | |Hold Right Alt for one keypress | +|`OS_RGUI` | |Hold Right GUI for one keypress | +|`OS_RCS` | |Hold Right Control and Right Shift for one keypress | +|`OS_RCA` | |Hold Right Control and Right Alt for one keypress | +|`OS_RCG` | |Hold Right Control and Right GUI for one keypress | +|`OS_RSA` | |Hold Right Shift and Right Alt for one keypress | +|`OS_RSG` | |Hold Right Shift and Right GUI for one keypress | +|`OS_RAG` | |Hold Right Alt and Right GUI for one keypress | +|`OS_RCSG` | |Hold Right Control, Right Shift and Right GUI for one keypress | +|`OS_RCAG` | |Hold Right Control, Right Alt and Right GUI for one keypress | +|`OS_RSAG` | |Hold Right Shift, Right Alt and Right GUI for one keypress | +|`OS_MEH` | |Hold Left Control, Left Shift and Left Alt for one keypress | +|`OS_HYPR` | |Hold Left Control, Left Shift, Left Alt and Left GUI for one keypress| + +When One Shot keys are turned off, `OSM()` and `OSL()` will behave like normal modifier keys and `MO()`, respectively. + +::: info +The `mod` parameter to the `OSM()` keycode must use the `MOD_*` prefix, rather than `KC_*`, eg. `OSM(MOD_LCTL | MOD_LSFT)`. +::: Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine. diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index a2a86e175cf..515386756d6 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -128,6 +128,41 @@ #define OSM(mod) (QK_ONE_SHOT_MOD | ((mod)&0x1F)) #define QK_ONE_SHOT_MOD_GET_MODS(kc) ((kc)&0x1F) +#define OS_LCTL OSM(MOD_LCTL) +#define OS_LSFT OSM(MOD_LSFT) +#define OS_LALT OSM(MOD_LALT) +#define OS_LGUI OSM(MOD_LGUI) + +#define OS_LCS OSM(MOD_LCTL | MOD_LSFT) +#define OS_LCA OSM(MOD_LCTL | MOD_LALT) +#define OS_LCG OSM(MOD_LCTL | MOD_LGUI) +#define OS_LSA OSM(MOD_LSFT | MOD_LALT) +#define OS_LSG OSM(MOD_LSFT | MOD_LGUI) +#define OS_LAG OSM(MOD_LALT | MOD_LGUI) + +#define OS_LCSG OSM(MOD_LCTL | MOD_LSFT | MOD_LGUI) +#define OS_LCAG OSM(MOD_LCTL | MOD_LALT | MOD_LGUI) +#define OS_LSAG OSM(MOD_LSFT | MOD_LALT | MOD_LGUI) + +#define OS_RCTL OSM(MOD_RCTL) +#define OS_RSFT OSM(MOD_RSFT) +#define OS_RALT OSM(MOD_RALT) +#define OS_RGUI OSM(MOD_RGUI) + +#define OS_RCS OSM(MOD_RCTL | MOD_RSFT) +#define OS_RCA OSM(MOD_RCTL | MOD_RALT) +#define OS_RCG OSM(MOD_RCTL | MOD_RGUI) +#define OS_RSA OSM(MOD_RSFT | MOD_RALT) +#define OS_RSG OSM(MOD_RSFT | MOD_RGUI) +#define OS_RAG OSM(MOD_RALT | MOD_RGUI) + +#define OS_RCSG OSM(MOD_RCTL | MOD_RSFT | MOD_RGUI) +#define OS_RCAG OSM(MOD_RCTL | MOD_RALT | MOD_RGUI) +#define OS_RSAG OSM(MOD_RSFT | MOD_RALT | MOD_RGUI) + +#define OS_MEH OSM(MOD_LCTL | MOD_LSFT | MOD_LALT) +#define OS_HYPR OSM(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI) + // Layer tap-toggle - 32 layer max #define TT(layer) (QK_LAYER_TAP_TOGGLE | ((layer)&0x1F)) #define QK_LAYER_TAP_TOGGLE_GET_LAYER(kc) ((kc)&0x1F) From 9c965bb62ec9ea84e68e0a1559dfbc35429df090 Mon Sep 17 00:00:00 2001 From: snappykey Date: Sun, 6 Jul 2025 10:39:10 +0300 Subject: [PATCH 23/37] Add Snappy Pad v.1 (#25419) --- keyboards/snappypad/v1_3x4/config.h | 5 ++ keyboards/snappypad/v1_3x4/keyboard.json | 48 ++++++++++++++ .../snappypad/v1_3x4/keymaps/default/keymap.c | 65 +++++++++++++++++++ keyboards/snappypad/v1_3x4/readme.md | 27 ++++++++ keyboards/snappypad/v1_3x4/v1_3x4.c | 11 ++++ 5 files changed, 156 insertions(+) create mode 100644 keyboards/snappypad/v1_3x4/config.h create mode 100644 keyboards/snappypad/v1_3x4/keyboard.json create mode 100644 keyboards/snappypad/v1_3x4/keymaps/default/keymap.c create mode 100644 keyboards/snappypad/v1_3x4/readme.md create mode 100644 keyboards/snappypad/v1_3x4/v1_3x4.c diff --git a/keyboards/snappypad/v1_3x4/config.h b/keyboards/snappypad/v1_3x4/config.h new file mode 100644 index 00000000000..040470b9330 --- /dev/null +++ b/keyboards/snappypad/v1_3x4/config.h @@ -0,0 +1,5 @@ +// Copyright 2025 Snappy Key +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_MASKED diff --git a/keyboards/snappypad/v1_3x4/keyboard.json b/keyboards/snappypad/v1_3x4/keyboard.json new file mode 100644 index 00000000000..26a3384a6f6 --- /dev/null +++ b/keyboards/snappypad/v1_3x4/keyboard.json @@ -0,0 +1,48 @@ +{ + "manufacturer": "Snappy Key", + "keyboard_name": "Snappy Pad v1", + "maintainer": "snappykey", + "development_board": "promicro", + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "F4", "pin_b": "F5"} + ] + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "encoder": true + }, + "matrix_pins": { + "cols": ["E6", "B4", "D7", "C6", "B6", "F6"], + "rows": ["D4", "D0", "D1"] + }, + "url": "snappykey.eu", + "usb": { + "device_version": "1.0.0", + "pid": "0x1451", + "vid": "0x16D0" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 4], "x": 0, "y": 0}, + {"matrix": [0, 5], "x": 3, "y": 0}, + {"matrix": [0, 0], "x": 0, "y": 1}, + {"matrix": [0, 1], "x": 1, "y": 1}, + {"matrix": [0, 2], "x": 2, "y": 1}, + {"matrix": [0, 3], "x": 3, "y": 1}, + {"matrix": [1, 0], "x": 0, "y": 2}, + {"matrix": [1, 1], "x": 1, "y": 2}, + {"matrix": [1, 2], "x": 2, "y": 2}, + {"matrix": [1, 3], "x": 3, "y": 2}, + {"matrix": [2, 0], "x": 0, "y": 3}, + {"matrix": [2, 1], "x": 1, "y": 3}, + {"matrix": [2, 2], "x": 2, "y": 3}, + {"matrix": [2, 3], "x": 3, "y": 3} + ] + } + } +} diff --git a/keyboards/snappypad/v1_3x4/keymaps/default/keymap.c b/keyboards/snappypad/v1_3x4/keymaps/default/keymap.c new file mode 100644 index 00000000000..8ebd851e77c --- /dev/null +++ b/keyboards/snappypad/v1_3x4/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +// Copyright 2025 Snappy Key +// SPDX-License-Identifier: GPL-2.0-or-later +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + TO(1), KC_MPLY, + KC_F13, KC_F14, KC_F15, KC_F16, + KC_F17, KC_F18, KC_F19, KC_F20, + KC_F21, KC_F22, KC_F23, KC_F24 + ), + [1] = LAYOUT( + TO(2), KC_TRNS, + LSFT(KC_F13), LSFT(KC_F14), LSFT(KC_F15), LSFT(KC_F16), + LSFT(KC_F17), LSFT(KC_F18), LSFT(KC_F19), LSFT(KC_F20), + LSFT(KC_F21), LSFT(KC_F22), LSFT(KC_F23), LSFT(KC_F24) + ), + [2] = LAYOUT( + TO(3), KC_TRNS, + LCTL(KC_F13), LCTL(KC_F14), LCTL(KC_F15), LCTL(KC_F16), + LCTL(KC_F17), LCTL(KC_F18), LCTL(KC_F19), LCTL(KC_F20), + LCTL(KC_F21), LCTL(KC_F22), LCTL(KC_F23), LCTL(KC_F24) + ), + [3] = LAYOUT( + TO(0), KC_TRNS, + LALT(KC_F13), LALT(KC_F14), LALT(KC_F15), LALT(KC_F16), + LALT(KC_F17), LALT(KC_F18), LALT(KC_F19), LALT(KC_F20), + LALT(KC_F21), LALT(KC_F22), LALT(KC_F23), LALT(KC_F24) + ) +}; + +layer_state_t layer_state_set_user(layer_state_t state) { + switch (get_highest_layer(state)) { + case 0: + gpio_write_pin_low(F7); + gpio_write_pin_low(B2); + gpio_write_pin_low(B5); + break; + case 1: + gpio_write_pin_high(F7); + gpio_write_pin_low(B2); + gpio_write_pin_low(B5); + break; + case 2: + gpio_write_pin_high(F7); + gpio_write_pin_high(B2); + gpio_write_pin_low(B5); + break; + case 3: + gpio_write_pin_high(F7); + gpio_write_pin_high(B2); + gpio_write_pin_high(B5); + break; + } + return state; +} + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) }, + [3] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif diff --git a/keyboards/snappypad/v1_3x4/readme.md b/keyboards/snappypad/v1_3x4/readme.md new file mode 100644 index 00000000000..8e69dc58b20 --- /dev/null +++ b/keyboards/snappypad/v1_3x4/readme.md @@ -0,0 +1,27 @@ +# Snappy Pad v.1 + +![sp](https://i.imgur.com/Xgv5qky.jpeg) + +Reliable macro pad for all use cases + +* Keyboard Maintainer: [SnappyKey](https://github.com/snappykey) +* Hardware Supported: pcb, cad files +* Hardware Availability: Will be open sourced later + +Make example for this keyboard (after setting up your build environment): + + make snappypad/v1_3x4:default + +Flashing example for this keyboard: + + make snappypad/v1_3x4:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available diff --git a/keyboards/snappypad/v1_3x4/v1_3x4.c b/keyboards/snappypad/v1_3x4/v1_3x4.c new file mode 100644 index 00000000000..e2a62773e8e --- /dev/null +++ b/keyboards/snappypad/v1_3x4/v1_3x4.c @@ -0,0 +1,11 @@ +// Copyright 2025 Snappy Key +// SPDX-License-Identifier: GPL-2.0-or-later +#include "quantum.h" + +void keyboard_post_init_kb(void) { + gpio_set_pin_output(F7); + gpio_set_pin_output(B2); + gpio_set_pin_output(B5); + + keyboard_post_init_user(); +} From 8ff7b1de11dc9c095f3eb37f1ace24af136df144 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 8 Jul 2025 05:12:11 +1000 Subject: [PATCH 24/37] [docs] WS2812: rewrite Open Drain section (#25454) --- docs/drivers/ws2812.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/drivers/ws2812.md b/docs/drivers/ws2812.md index 4d1e7279281..0c26ec62480 100644 --- a/docs/drivers/ws2812.md +++ b/docs/drivers/ws2812.md @@ -144,18 +144,30 @@ The following defines apply only to ARM devices: |`WS2812_T1L`|`(WS2812_TIMING - WS2812_T1H)`|The length of a "1" bit's low phase in nanoseconds (bitbang and PIO drivers only)| |`WS2812_T0L`|`(WS2812_TIMING - WS2812_T0H)`|The length of a "0" bit's low phase in nanoseconds (bitbang and PIO drivers only)| -### Push-Pull and Open Drain {#push-pull-open-drain} +### Logic Levels {#logic-levels} -By default, the GPIO used for data transmission is configured as a *push-pull* output, meaning the pin is effectively always driven either to VCC or to ground. +WS2812 LEDs usually operate at 5V, but some microcontrollers, particularly ARM-based ones, run on 3.3V. This can pose an issue when driving the LED chain as the logic level voltage is lower than the power supply voltage, leading to unreliable data transmission. There are two main workarounds: -For situations where the logic level voltage is lower than the power supply voltage, however, this can pose an issue. The solution is to configure the pin for *open drain* mode instead, and use a pullup resistor between the DI pin and VCC. In this mode, the MCU can only pull the GPIO *low*, or leave it floating. The pullup resistor is then responsible for pulling the line high, when the MCU is not driving the GPIO. +#### 1. Open Drain Circuit {#open-drain-circuit} -To configure the DI pin for open drain configuration, add the following to your `config.h`: +By default, `WS2812_DI_PIN` is configured as a *push-pull* output, meaning the pin is effectively always driven either to VCC or to ground; however, it can be configured in *open drain* mode instead. + +In this mode, the MCU will only pull the GPIO *low*, and leaves it floating otherwise. A pullup resistor (typically around 10kΩ) between DI and 5V is then responsible for pulling the line high when the MCU is not driving the GPIO. + +To use the DI pin in open drain configuration, add the following to your `config.h`: ```c #define WS2812_EXTERNAL_PULLUP ``` +::: warning +Because the GPIO is being pulled to 5V in this situation rather than VCC (3.3V), **it must be a 5V tolerant pin**. Consult your MCU's datasheet first – if there are no eligible pins, you must use a level shifter instead. +::: + +#### 2. Level Shifter {#level-shifter} + +A level shifter IC, such as the SN74LV1T34, can be placed between the GPIO and the first LED's DI pin to convert the 3.3V logic to 5V. This requires no additional configuration in the firmware, nor a 5V tolerant GPIO, but may be more expensive and is generally less handwire-friendly. + ### SPI Driver {#arm-spi-driver} Depending on the ChibiOS board configuration, you may need to enable SPI at the keyboard level. For STM32, this would look like: From 0524a6d8486470c9e4a4111e4a8bcf829edb9d38 Mon Sep 17 00:00:00 2001 From: srk24 <25836646+srk24@users.noreply.github.com> Date: Tue, 8 Jul 2025 03:23:46 +0800 Subject: [PATCH 25/37] [keyboard]Graystudio BD60 Support (#25337) --- keyboards/gray_studio/bd60/bd60.c | 41 +++ keyboards/gray_studio/bd60/keyboard.json | 312 ++++++++++++++++++ .../gray_studio/bd60/keymaps/default/keymap.c | 20 ++ keyboards/gray_studio/bd60/matrix_diagram.md | 24 ++ keyboards/gray_studio/bd60/readme.md | 21 ++ 5 files changed, 418 insertions(+) create mode 100644 keyboards/gray_studio/bd60/bd60.c create mode 100644 keyboards/gray_studio/bd60/keyboard.json create mode 100644 keyboards/gray_studio/bd60/keymaps/default/keymap.c create mode 100644 keyboards/gray_studio/bd60/matrix_diagram.md create mode 100644 keyboards/gray_studio/bd60/readme.md diff --git a/keyboards/gray_studio/bd60/bd60.c b/keyboards/gray_studio/bd60/bd60.c new file mode 100644 index 00000000000..2461485e69a --- /dev/null +++ b/keyboards/gray_studio/bd60/bd60.c @@ -0,0 +1,41 @@ +/* Copyright 2023 CMM.S Freather + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +#ifdef RGBLIGHT_LAYERS +const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( + {0, 1, HSV_WHITE} +); + +// Now define the array of layers. Later layers take precedence +const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST( + my_capslock_layer +); + +void keyboard_post_init_kb(void){ + rgblight_layers = my_rgb_layers; + keyboard_post_init_user(); +} + +bool led_update_kb(led_t led_state){ + bool res = led_update_user(led_state); + if (res) { + rgblight_set_layer_state(0, led_state.caps_lock); + } + return res; +} +#endif diff --git a/keyboards/gray_studio/bd60/keyboard.json b/keyboards/gray_studio/bd60/keyboard.json new file mode 100644 index 00000000000..d9c5133b1ec --- /dev/null +++ b/keyboards/gray_studio/bd60/keyboard.json @@ -0,0 +1,312 @@ +{ + "manufacturer": "GrayStudio", + "keyboard_name": "BD60", + "maintainer": "srk24", + "bootloader": "stm32-dfu", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["A3", "C14", "C13", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "B0", "A8", "B15", "B14"], + "rows": ["B13", "B12", "A2", "A0", "A1"] + }, + "processor": "STM32F072", + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "brightness_steps": 8, + "default": { + "animation": "rainbow_mood" + }, + "layers": { + "enabled": true + }, + "led_count": 1, + "max_brightness": 150, + "saturation_steps": 8, + "sleep": true + }, + "usb": { + "device_version": "0.0.2", + "pid": "0x4060", + "vid": "0x4753" + }, + "ws2812": { + "pin": "B10" + }, + "community_layouts": ["60_ansi", "60_ansi_wkl", "60_hhkb"], + "layouts": { + "LAYOUT_60_ansi": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 2], "x": 1.5, "y": 1}, + {"matrix": [1, 3], "x": 2.5, "y": 1}, + {"matrix": [1, 4], "x": 3.5, "y": 1}, + {"matrix": [1, 5], "x": 4.5, "y": 1}, + {"matrix": [1, 6], "x": 5.5, "y": 1}, + {"matrix": [1, 7], "x": 6.5, "y": 1}, + {"matrix": [1, 8], "x": 7.5, "y": 1}, + {"matrix": [1, 9], "x": 8.5, "y": 1}, + {"matrix": [1, 10], "x": 9.5, "y": 1}, + {"matrix": [1, 11], "x": 10.5, "y": 1}, + {"matrix": [1, 12], "x": 11.5, "y": 1}, + {"matrix": [1, 13], "x": 12.5, "y": 1}, + {"matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 2], "x": 1.75, "y": 2}, + {"matrix": [2, 3], "x": 2.75, "y": 2}, + {"matrix": [2, 4], "x": 3.75, "y": 2}, + {"matrix": [2, 5], "x": 4.75, "y": 2}, + {"matrix": [2, 6], "x": 5.75, "y": 2}, + {"matrix": [2, 7], "x": 6.75, "y": 2}, + {"matrix": [2, 8], "x": 7.75, "y": 2}, + {"matrix": [2, 9], "x": 8.75, "y": 2}, + {"matrix": [2, 10], "x": 9.75, "y": 2}, + {"matrix": [2, 11], "x": 10.75, "y": 2}, + {"matrix": [2, 12], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 13], "x": 12.25, "y": 3, "w": 2.75}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [4, 7], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25} + ] + }, + "LAYOUT_60_ansi_wkl": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0, "w": 2}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 2], "x": 1.5, "y": 1}, + {"matrix": [1, 3], "x": 2.5, "y": 1}, + {"matrix": [1, 4], "x": 3.5, "y": 1}, + {"matrix": [1, 5], "x": 4.5, "y": 1}, + {"matrix": [1, 6], "x": 5.5, "y": 1}, + {"matrix": [1, 7], "x": 6.5, "y": 1}, + {"matrix": [1, 8], "x": 7.5, "y": 1}, + {"matrix": [1, 9], "x": 8.5, "y": 1}, + {"matrix": [1, 10], "x": 9.5, "y": 1}, + {"matrix": [1, 11], "x": 10.5, "y": 1}, + {"matrix": [1, 12], "x": 11.5, "y": 1}, + {"matrix": [1, 13], "x": 12.5, "y": 1}, + {"matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 2], "x": 1.75, "y": 2}, + {"matrix": [2, 3], "x": 2.75, "y": 2}, + {"matrix": [2, 4], "x": 3.75, "y": 2}, + {"matrix": [2, 5], "x": 4.75, "y": 2}, + {"matrix": [2, 6], "x": 5.75, "y": 2}, + {"matrix": [2, 7], "x": 6.75, "y": 2}, + {"matrix": [2, 8], "x": 7.75, "y": 2}, + {"matrix": [2, 9], "x": 8.75, "y": 2}, + {"matrix": [2, 10], "x": 9.75, "y": 2}, + {"matrix": [2, 11], "x": 10.75, "y": 2}, + {"matrix": [2, 12], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 13], "x": 12.25, "y": 3, "w": 2.75}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 3.75, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.5}, + {"matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.5} + ] + }, + "LAYOUT_60_hhkb": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 2], "x": 1.5, "y": 1}, + {"matrix": [1, 3], "x": 2.5, "y": 1}, + {"matrix": [1, 4], "x": 3.5, "y": 1}, + {"matrix": [1, 5], "x": 4.5, "y": 1}, + {"matrix": [1, 6], "x": 5.5, "y": 1}, + {"matrix": [1, 7], "x": 6.5, "y": 1}, + {"matrix": [1, 8], "x": 7.5, "y": 1}, + {"matrix": [1, 9], "x": 8.5, "y": 1}, + {"matrix": [1, 10], "x": 9.5, "y": 1}, + {"matrix": [1, 11], "x": 10.5, "y": 1}, + {"matrix": [1, 12], "x": 11.5, "y": 1}, + {"matrix": [1, 13], "x": 12.5, "y": 1}, + {"matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 2], "x": 1.75, "y": 2}, + {"matrix": [2, 3], "x": 2.75, "y": 2}, + {"matrix": [2, 4], "x": 3.75, "y": 2}, + {"matrix": [2, 5], "x": 4.75, "y": 2}, + {"matrix": [2, 6], "x": 5.75, "y": 2}, + {"matrix": [2, 7], "x": 6.75, "y": 2}, + {"matrix": [2, 8], "x": 7.75, "y": 2}, + {"matrix": [2, 9], "x": 8.75, "y": 2}, + {"matrix": [2, 10], "x": 9.75, "y": 2}, + {"matrix": [2, 11], "x": 10.75, "y": 2}, + {"matrix": [2, 12], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 13], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 14], "x": 14, "y": 3}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1}, + {"matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 7], "x": 3.75, "y": 4, "w": 7}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.5}, + {"matrix": [4, 13], "x": 12.5, "y": 4, "w": 1} + ] + }, + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 2], "x": 1.5, "y": 1}, + {"matrix": [1, 3], "x": 2.5, "y": 1}, + {"matrix": [1, 4], "x": 3.5, "y": 1}, + {"matrix": [1, 5], "x": 4.5, "y": 1}, + {"matrix": [1, 6], "x": 5.5, "y": 1}, + {"matrix": [1, 7], "x": 6.5, "y": 1}, + {"matrix": [1, 8], "x": 7.5, "y": 1}, + {"matrix": [1, 9], "x": 8.5, "y": 1}, + {"matrix": [1, 10], "x": 9.5, "y": 1}, + {"matrix": [1, 11], "x": 10.5, "y": 1}, + {"matrix": [1, 12], "x": 11.5, "y": 1}, + {"matrix": [1, 13], "x": 12.5, "y": 1}, + {"matrix": [1, 14], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 2], "x": 1.75, "y": 2}, + {"matrix": [2, 3], "x": 2.75, "y": 2}, + {"matrix": [2, 4], "x": 3.75, "y": 2}, + {"matrix": [2, 5], "x": 4.75, "y": 2}, + {"matrix": [2, 6], "x": 5.75, "y": 2}, + {"matrix": [2, 7], "x": 6.75, "y": 2}, + {"matrix": [2, 8], "x": 7.75, "y": 2}, + {"matrix": [2, 9], "x": 8.75, "y": 2}, + {"matrix": [2, 10], "x": 9.75, "y": 2}, + {"matrix": [2, 11], "x": 10.75, "y": 2}, + {"matrix": [2, 12], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 13], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 14], "x": 14, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [4, 3], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [4, 7], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 10], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 13], "x": 12.5, "y": 4, "w": 1.25}, + {"matrix": [4, 14], "x": 13.75, "y": 4, "w": 1.25} + ] + } + } +} diff --git a/keyboards/gray_studio/bd60/keymaps/default/keymap.c b/keyboards/gray_studio/bd60/keymaps/default/keymap.c new file mode 100644 index 00000000000..91aaf1d11d9 --- /dev/null +++ b/keyboards/gray_studio/bd60/keymaps/default/keymap.c @@ -0,0 +1,20 @@ +// Copyright 2023 srk24 +// SPDX-License-Identifier: GPL-2.0 +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, MO(1) + ), + [1] = LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + _______, UG_TOGG, KC_UP, UG_NEXT, _______, _______, _______, UG_VALU, UG_VALD, _______, _______, _______, _______, KC_INS, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_MPRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, _______, + _______, _______, _______, KC_MPLY, _______, KC_LEFT, KC_RGHT, _______ + ) +}; diff --git a/keyboards/gray_studio/bd60/matrix_diagram.md b/keyboards/gray_studio/bd60/matrix_diagram.md new file mode 100644 index 00000000000..622864bf91e --- /dev/null +++ b/keyboards/gray_studio/bd60/matrix_diagram.md @@ -0,0 +1,24 @@ +# Matrix Diagram for GrayStudio BD60 + +``` + ┌───────┐ + 2u Backspace │0D │ + └───────┘ +┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ +│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │ +├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ +│10 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │ +├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ +│20 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D │ +├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ +│30 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D │3E │ +├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ +│40 │41 │43 │47 │4A │4B │4D │4E │ +└────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +┌────────┐ ┌──────────┐ +│30 │ 2.25u LShift 2.75u RShift │3D │ +└────────┘ └──────────┘ +┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐ +│40 │41 │43 │47 │4B │4D │4E │ Tsangan/WKL/HHKB +└─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +``` diff --git a/keyboards/gray_studio/bd60/readme.md b/keyboards/gray_studio/bd60/readme.md new file mode 100644 index 00000000000..9be7724be39 --- /dev/null +++ b/keyboards/gray_studio/bd60/readme.md @@ -0,0 +1,21 @@ +# Gray Studio BD60 + +A 65% keyboard by Graystudio. PCB designed and manufactured by DEMO Studio. + +* Keyboard Maintainer: [srk24](https://github.com/srk24) +* Hardware Support: BD60 PCB w/ STM32F072 microcontroller +* Hardware Availability: [graystudio.club/bd60](https://in-stock.graystudio.club/products/in-stock-bd60) + +Make example for this keyboard (after setting up your build environment): + + make gray_studio/bd60:default + +Flashing example for this keyboard: + + make gray_studio/bd60:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead From 2916c3f0980e86a925eeefcf57ebad7126d88f39 Mon Sep 17 00:00:00 2001 From: Ning Date: Tue, 8 Jul 2025 13:49:44 +0800 Subject: [PATCH 26/37] [Keyboard] Update ning_tinyboard_tb16rgb diode direction (#25379) * Update ning_tinyboard_tb16rgb diode_direction * enable LTO add rules.mk and enable RGB_MATRIX_CUSTOM_USER add add rgb_matrix_user.inc * remove files --- keyboards/ning/tiny_board/tb16_rgb/keyboard.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json index 4501c4daeb2..9e99ef879ab 100644 --- a/keyboards/ning/tiny_board/tb16_rgb/keyboard.json +++ b/keyboards/ning/tiny_board/tb16_rgb/keyboard.json @@ -2,7 +2,10 @@ "manufacturer": "Ning", "keyboard_name": "TB16 RGB", "maintainer": "ningjx", - "diode_direction": "COL2ROW", + "diode_direction": "ROW2COL", + "build": { + "lto": true + }, "features": { "bootmagic": true, "extrakey": true, From a26dbbfe96834c022ca10406e3c61382b1f07a1f Mon Sep 17 00:00:00 2001 From: Cipulot <40441626+Cipulot@users.noreply.github.com> Date: Tue, 8 Jul 2025 14:59:45 +0900 Subject: [PATCH 27/37] [Keyboard] Add MX65X (#25214) * Addition of MX65X * Folder separation * Fix * Update readme * Update keymap.c Co-authored-by: Drashna Jaelre * Update keymap.c Co-authored-by: Drashna Jaelre * Update keymap.c Co-authored-by: Drashna Jaelre * Update keymap.c Co-authored-by: Drashna Jaelre * Update keymap.c Co-authored-by: Drashna Jaelre * Update info.json --------- Co-authored-by: Drashna Jaelre --- keyboards/cipulot/mx65x/config.h | 24 + keyboards/cipulot/mx65x/halconf.h | 21 + keyboards/cipulot/mx65x/hotswap/keyboard.json | 6 + keyboards/cipulot/mx65x/hotswap/rules.mk | 2 + keyboards/cipulot/mx65x/info.json | 421 ++++++++++++++++++ .../mx65x/keymaps/65_ansi_blocker/keymap.c | 50 +++ .../mx65x/keymaps/65_ansi_blocker/rules.mk | 1 + .../keymaps/65_ansi_blocker_tsangan/keymap.c | 50 +++ .../keymaps/65_ansi_blocker_tsangan/rules.mk | 1 + .../mx65x/keymaps/65_iso_blocker/keymap.c | 50 +++ .../mx65x/keymaps/65_iso_blocker/rules.mk | 1 + .../keymaps/65_iso_blocker_tsangan/keymap.c | 50 +++ .../keymaps/65_iso_blocker_tsangan/rules.mk | 1 + .../cipulot/mx65x/keymaps/default/keymap.c | 50 +++ .../cipulot/mx65x/keymaps/default/rules.mk | 1 + keyboards/cipulot/mx65x/mcuconf.h | 22 + keyboards/cipulot/mx65x/readme.md | 36 ++ keyboards/cipulot/mx65x/solder/keyboard.json | 6 + keyboards/cipulot/mx65x/solder/rules.mk | 2 + 19 files changed, 795 insertions(+) create mode 100644 keyboards/cipulot/mx65x/config.h create mode 100644 keyboards/cipulot/mx65x/halconf.h create mode 100644 keyboards/cipulot/mx65x/hotswap/keyboard.json create mode 100644 keyboards/cipulot/mx65x/hotswap/rules.mk create mode 100644 keyboards/cipulot/mx65x/info.json create mode 100644 keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/keymap.c create mode 100644 keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/rules.mk create mode 100644 keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/keymap.c create mode 100644 keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/rules.mk create mode 100644 keyboards/cipulot/mx65x/keymaps/65_iso_blocker/keymap.c create mode 100644 keyboards/cipulot/mx65x/keymaps/65_iso_blocker/rules.mk create mode 100644 keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/keymap.c create mode 100644 keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/rules.mk create mode 100644 keyboards/cipulot/mx65x/keymaps/default/keymap.c create mode 100644 keyboards/cipulot/mx65x/keymaps/default/rules.mk create mode 100644 keyboards/cipulot/mx65x/mcuconf.h create mode 100644 keyboards/cipulot/mx65x/readme.md create mode 100644 keyboards/cipulot/mx65x/solder/keyboard.json create mode 100644 keyboards/cipulot/mx65x/solder/rules.mk diff --git a/keyboards/cipulot/mx65x/config.h b/keyboards/cipulot/mx65x/config.h new file mode 100644 index 00000000000..5f4cc719117 --- /dev/null +++ b/keyboards/cipulot/mx65x/config.h @@ -0,0 +1,24 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +// PWM driver with direct memory access (DMA) support +#define WS2812_PWM_DRIVER PWMD1 +#define WS2812_PWM_CHANNEL 2 +#define WS2812_PWM_PAL_MODE 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM5 +#define WS2812_DMA_CHANNEL 6 diff --git a/keyboards/cipulot/mx65x/halconf.h b/keyboards/cipulot/mx65x/halconf.h new file mode 100644 index 00000000000..d220b03aa31 --- /dev/null +++ b/keyboards/cipulot/mx65x/halconf.h @@ -0,0 +1,21 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#define HAL_USE_PWM TRUE + +#include_next diff --git a/keyboards/cipulot/mx65x/hotswap/keyboard.json b/keyboards/cipulot/mx65x/hotswap/keyboard.json new file mode 100644 index 00000000000..bba641aa0ba --- /dev/null +++ b/keyboards/cipulot/mx65x/hotswap/keyboard.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "MX65X Hotswap", + "usb": { + "pid": "0x6BD8" + } +} diff --git a/keyboards/cipulot/mx65x/hotswap/rules.mk b/keyboards/cipulot/mx65x/hotswap/rules.mk new file mode 100644 index 00000000000..0ab54aaaf71 --- /dev/null +++ b/keyboards/cipulot/mx65x/hotswap/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF diff --git a/keyboards/cipulot/mx65x/info.json b/keyboards/cipulot/mx65x/info.json new file mode 100644 index 00000000000..8de5c0d5443 --- /dev/null +++ b/keyboards/cipulot/mx65x/info.json @@ -0,0 +1,421 @@ +{ + "manufacturer": "Cipulot", + "maintainer": "Cipulot", + "bootloader": "stm32-dfu", + "build": { + "lto": true + }, + "diode_direction": "COL2ROW", + "encoder": { + "rotary": [ + {"pin_a": "F0", "pin_b": "F1"} + ] + }, + "features": { + "bootmagic": true, + "encoder": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["B14", "B12", "B11", "B10", "B2", "B1", "B0", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0"], + "rows": ["A15", "B7", "B13", "B15", "A8"] + }, + "processor": "STM32F072", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "rgb_test": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "led_count": 26 + }, + "usb": { + "device_version": "0.0.1", + "shared_endpoint": { + "keyboard": true + }, + "vid": "0x6369" + }, + "ws2812": { + "driver": "pwm", + "pin": "A9" + }, + "layouts": { + "LAYOUT_65_ansi_blocker": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 14], "x": 13, "y": 0, "w": 2}, + {"matrix": [1, 14], "x": 15, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 14], "x": 15, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 14], "x": 15, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + {"matrix": [4, 14], "x": 15, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 13, "y": 4}, + {"matrix": [4, 12], "x": 14, "y": 4}, + {"matrix": [4, 13], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_ansi_blocker_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 14], "x": 13, "y": 0, "w": 2}, + {"matrix": [1, 14], "x": 15, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 14], "x": 15, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 13], "x": 12.75, "y": 2, "w": 2.25}, + {"matrix": [3, 14], "x": 15, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + {"matrix": [4, 14], "x": 15, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 13, "y": 4}, + {"matrix": [4, 12], "x": 14, "y": 4}, + {"matrix": [4, 13], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_iso_blocker": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 14], "x": 13, "y": 0, "w": 2}, + {"matrix": [1, 14], "x": 15, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [2, 14], "x": 15, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [3, 14], "x": 15, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + {"matrix": [4, 14], "x": 15, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25}, + {"matrix": [4, 1], "x": 1.25, "y": 4, "w": 1.25}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.25}, + {"matrix": [4, 6], "x": 3.75, "y": 4, "w": 6.25}, + {"matrix": [4, 9], "x": 10, "y": 4, "w": 1.25}, + {"matrix": [4, 10], "x": 11.25, "y": 4, "w": 1.25}, + {"matrix": [4, 11], "x": 13, "y": 4}, + {"matrix": [4, 12], "x": 14, "y": 4}, + {"matrix": [4, 13], "x": 15, "y": 4} + ] + }, + "LAYOUT_65_iso_blocker_tsangan": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 14], "x": 13, "y": 0, "w": 2}, + {"matrix": [1, 14], "x": 15, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [2, 14], "x": 15, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 1, "w": 1.25, "h": 2}, + {"matrix": [3, 14], "x": 15, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + {"matrix": [4, 14], "x": 15, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 6], "x": 4, "y": 4, "w": 7}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 13, "y": 4}, + {"matrix": [4, 12], "x": 14, "y": 4}, + {"matrix": [4, 13], "x": 15, "y": 4} + ] + }, + "LAYOUT_all": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0}, + {"matrix": [0, 5], "x": 5, "y": 0}, + {"matrix": [0, 6], "x": 6, "y": 0}, + {"matrix": [0, 7], "x": 7, "y": 0}, + {"matrix": [0, 8], "x": 8, "y": 0}, + {"matrix": [0, 9], "x": 9, "y": 0}, + {"matrix": [0, 10], "x": 10, "y": 0}, + {"matrix": [0, 11], "x": 11, "y": 0}, + {"matrix": [0, 12], "x": 12, "y": 0}, + {"matrix": [0, 13], "x": 13, "y": 0}, + {"matrix": [0, 14], "x": 14, "y": 0}, + {"matrix": [1, 14], "x": 15, "y": 0}, + {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5}, + {"matrix": [1, 1], "x": 1.5, "y": 1}, + {"matrix": [1, 2], "x": 2.5, "y": 1}, + {"matrix": [1, 3], "x": 3.5, "y": 1}, + {"matrix": [1, 4], "x": 4.5, "y": 1}, + {"matrix": [1, 5], "x": 5.5, "y": 1}, + {"matrix": [1, 6], "x": 6.5, "y": 1}, + {"matrix": [1, 7], "x": 7.5, "y": 1}, + {"matrix": [1, 8], "x": 8.5, "y": 1}, + {"matrix": [1, 9], "x": 9.5, "y": 1}, + {"matrix": [1, 10], "x": 10.5, "y": 1}, + {"matrix": [1, 11], "x": 11.5, "y": 1}, + {"matrix": [1, 12], "x": 12.5, "y": 1}, + {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5}, + {"matrix": [2, 14], "x": 15, "y": 1}, + {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75}, + {"matrix": [2, 1], "x": 1.75, "y": 2}, + {"matrix": [2, 2], "x": 2.75, "y": 2}, + {"matrix": [2, 3], "x": 3.75, "y": 2}, + {"matrix": [2, 4], "x": 4.75, "y": 2}, + {"matrix": [2, 5], "x": 5.75, "y": 2}, + {"matrix": [2, 6], "x": 6.75, "y": 2}, + {"matrix": [2, 7], "x": 7.75, "y": 2}, + {"matrix": [2, 8], "x": 8.75, "y": 2}, + {"matrix": [2, 9], "x": 9.75, "y": 2}, + {"matrix": [2, 10], "x": 10.75, "y": 2}, + {"matrix": [2, 11], "x": 11.75, "y": 2}, + {"matrix": [2, 12], "x": 12.75, "y": 2}, + {"matrix": [2, 13], "x": 13.75, "y": 2, "w": 1.25}, + {"matrix": [3, 14], "x": 15, "y": 2}, + {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.25}, + {"matrix": [3, 1], "x": 1.25, "y": 3}, + {"matrix": [3, 2], "x": 2.25, "y": 3}, + {"matrix": [3, 3], "x": 3.25, "y": 3}, + {"matrix": [3, 4], "x": 4.25, "y": 3}, + {"matrix": [3, 5], "x": 5.25, "y": 3}, + {"matrix": [3, 6], "x": 6.25, "y": 3}, + {"matrix": [3, 7], "x": 7.25, "y": 3}, + {"matrix": [3, 8], "x": 8.25, "y": 3}, + {"matrix": [3, 9], "x": 9.25, "y": 3}, + {"matrix": [3, 10], "x": 10.25, "y": 3}, + {"matrix": [3, 11], "x": 11.25, "y": 3}, + {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75}, + {"matrix": [3, 13], "x": 14, "y": 3}, + {"matrix": [4, 14], "x": 15, "y": 3}, + {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5}, + {"matrix": [4, 1], "x": 1.5, "y": 4}, + {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5}, + {"matrix": [4, 4], "x": 4, "y": 4, "w": 2.5}, + {"matrix": [4, 6], "x": 6.5, "y": 4}, + {"matrix": [4, 8], "x": 7.5, "y": 4, "w": 2.5}, + {"matrix": [4, 9], "x": 10, "y": 4}, + {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5}, + {"matrix": [4, 11], "x": 13, "y": 4}, + {"matrix": [4, 12], "x": 14, "y": 4}, + {"matrix": [4, 13], "x": 15, "y": 4} + ] + } + } +} diff --git a/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/keymap.c b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/keymap.c new file mode 100644 index 00000000000..804fb205213 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65_ansi_blocker( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_65_ansi_blocker( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_ansi_blocker( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif +// clang-format on diff --git a/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/rules.mk b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/keymap.c b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/keymap.c new file mode 100644 index 00000000000..84d7ad06beb --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65_ansi_blocker_tsangan( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_65_ansi_blocker_tsangan( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_ansi_blocker_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif +// clang-format on diff --git a/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/rules.mk b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_ansi_blocker_tsangan/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cipulot/mx65x/keymaps/65_iso_blocker/keymap.c b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker/keymap.c new file mode 100644 index 00000000000..9e7016bfb6b --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65_iso_blocker( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENTER, KC_PGDN, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_65_iso_blocker( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_iso_blocker( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif +// clang-format on diff --git a/keyboards/cipulot/mx65x/keymaps/65_iso_blocker/rules.mk b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/keymap.c b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/keymap.c new file mode 100644 index 00000000000..a18cc4fe4ef --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65_iso_blocker_tsangan( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENTER, KC_PGDN, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_65_iso_blocker_tsangan( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_65_iso_blocker_tsangan( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif +// clang-format on diff --git a/keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/rules.mk b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/65_iso_blocker_tsangan/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cipulot/mx65x/keymaps/default/keymap.c b/keyboards/cipulot/mx65x/keymaps/default/keymap.c new file mode 100644 index 00000000000..e0f5ea12cb9 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/default/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +// clang-format off +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_all( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENTER, KC_PGDN, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT), + + [1] = LAYOUT_all( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MO(2), _______, _______, _______), + + [2] = LAYOUT_all( + QK_BOOT, NK_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +#if defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [1] = { ENCODER_CCW_CW(_______, _______) }, + [2] = { ENCODER_CCW_CW(_______, _______) } +}; +#endif +// clang-format on diff --git a/keyboards/cipulot/mx65x/keymaps/default/rules.mk b/keyboards/cipulot/mx65x/keymaps/default/rules.mk new file mode 100644 index 00000000000..ee325681483 --- /dev/null +++ b/keyboards/cipulot/mx65x/keymaps/default/rules.mk @@ -0,0 +1 @@ +ENCODER_MAP_ENABLE = yes diff --git a/keyboards/cipulot/mx65x/mcuconf.h b/keyboards/cipulot/mx65x/mcuconf.h new file mode 100644 index 00000000000..b939e653953 --- /dev/null +++ b/keyboards/cipulot/mx65x/mcuconf.h @@ -0,0 +1,22 @@ +/* Copyright 2025 Cipulot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include_next + +#undef STM32_PWM_USE_TIM1 +#define STM32_PWM_USE_TIM1 TRUE diff --git a/keyboards/cipulot/mx65x/readme.md b/keyboards/cipulot/mx65x/readme.md new file mode 100644 index 00000000000..e6b07fc03b6 --- /dev/null +++ b/keyboards/cipulot/mx65x/readme.md @@ -0,0 +1,36 @@ +# MX65X + +A 65% solder and hotswap PCB. + +Solder + +![MX65X Solder](https://i.imgur.com/M2lyPuo.png) + +Hotswap + +![MX65X Hotswap](https://i.imgur.com/18DnNrw.png) + + +* Keyboard Maintainer: [cipulot](https://github.com/cipulot) +* Hardware Supported: MX65X Solder and Hotswap +* Hardware Availability: [Clever Keebs](https://cleverkeebs.com) + +Make example for this keyboard (after setting up your build environment): + + make cipulot/mx65x/solder:default + make cipulot/mx65x/hotswap:default + +Flashing example for this keyboard: + + make cipulot/mx65x/solder:default:flash + make cipulot/mx65x/hotswap:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is configured. +* **Physical reset button**: Long press the reset button soldered on the PCB. +* **Bootmagic reset**: Hold down the top left key and plug in the controller. diff --git a/keyboards/cipulot/mx65x/solder/keyboard.json b/keyboards/cipulot/mx65x/solder/keyboard.json new file mode 100644 index 00000000000..119397bef0b --- /dev/null +++ b/keyboards/cipulot/mx65x/solder/keyboard.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "MX65X Solder", + "usb": { + "pid": "0x6BD7" + } +} diff --git a/keyboards/cipulot/mx65x/solder/rules.mk b/keyboards/cipulot/mx65x/solder/rules.mk new file mode 100644 index 00000000000..0ab54aaaf71 --- /dev/null +++ b/keyboards/cipulot/mx65x/solder/rules.mk @@ -0,0 +1,2 @@ +# Wildcard to allow APM32 MCU +DFU_SUFFIX_ARGS = -v FFFF -p FFFF From f1b2449ce577f83218f4050fe77036cd408e9738 Mon Sep 17 00:00:00 2001 From: ASHIJA <24617794+ASHIJANKEN@users.noreply.github.com> Date: Tue, 8 Jul 2025 15:00:20 +0900 Subject: [PATCH 28/37] [Keyboard] Add Slimorta (#25348) * Add Slimorta * Update readme.md * Apply suggestions from code review for #25348 Co-authored-by: jack --------- Co-authored-by: jack --- keyboards/slimorta/keyboard.json | 86 +++++++++++++++++++++ keyboards/slimorta/keymaps/default/keymap.c | 27 +++++++ keyboards/slimorta/readme.md | 23 ++++++ 3 files changed, 136 insertions(+) create mode 100644 keyboards/slimorta/keyboard.json create mode 100644 keyboards/slimorta/keymaps/default/keymap.c create mode 100644 keyboards/slimorta/readme.md diff --git a/keyboards/slimorta/keyboard.json b/keyboards/slimorta/keyboard.json new file mode 100644 index 00000000000..ecf3078f4ee --- /dev/null +++ b/keyboards/slimorta/keyboard.json @@ -0,0 +1,86 @@ +{ + "manufacturer": "ASHIJANKEN", + "keyboard_name": "Slimorta", + "maintainer": "ASHIJANKEN", + "development_board": "promicro", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "cols": ["D1", "D0", "D4", "C6", "D7", "E6"], + "rows": ["B4", "B5", "F4", "F5", "F6", "F7", "B1", "B3", "B2", "B6"] + }, + "url": "https://github.com/ASHIJANKEN/Slimorta", + "usb": { + "device_version": "1.0.0", + "pid": "0x0001", + "vid": "0x4153" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [2, 0], "x": 0, "y": 0}, + {"matrix": [2, 1], "x": 1, "y": 0}, + {"matrix": [2, 2], "x": 2, "y": 0}, + {"matrix": [2, 3], "x": 3, "y": 0}, + {"matrix": [2, 4], "x": 4, "y": 0}, + {"matrix": [2, 5], "x": 5, "y": 0}, + {"matrix": [0, 5], "x": 6, "y": 0}, + {"matrix": [0, 4], "x": 7, "y": 0}, + {"matrix": [0, 3], "x": 8, "y": 0}, + {"matrix": [0, 2], "x": 9, "y": 0}, + {"matrix": [0, 1], "x": 10, "y": 0}, + {"matrix": [0, 0], "x": 11, "y": 0}, + {"matrix": [3, 0], "x": 0, "y": 1}, + {"matrix": [3, 1], "x": 1, "y": 1}, + {"matrix": [3, 2], "x": 2, "y": 1}, + {"matrix": [3, 3], "x": 3, "y": 1}, + {"matrix": [3, 4], "x": 4, "y": 1}, + {"matrix": [3, 5], "x": 5, "y": 1}, + {"matrix": [1, 5], "x": 6, "y": 1}, + {"matrix": [1, 4], "x": 7, "y": 1}, + {"matrix": [1, 3], "x": 8, "y": 1}, + {"matrix": [1, 2], "x": 9, "y": 1}, + {"matrix": [1, 1], "x": 10, "y": 1}, + {"matrix": [1, 0], "x": 11, "y": 1}, + {"matrix": [4, 0], "x": 0, "y": 2}, + {"matrix": [4, 1], "x": 1, "y": 2}, + {"matrix": [4, 2], "x": 2, "y": 2}, + {"matrix": [4, 3], "x": 3, "y": 2}, + {"matrix": [4, 4], "x": 4, "y": 2}, + {"matrix": [4, 5], "x": 5, "y": 2}, + {"matrix": [7, 5], "x": 6, "y": 2}, + {"matrix": [7, 4], "x": 7, "y": 2}, + {"matrix": [7, 3], "x": 8, "y": 2}, + {"matrix": [7, 2], "x": 9, "y": 2}, + {"matrix": [7, 1], "x": 10, "y": 2}, + {"matrix": [7, 0], "x": 11, "y": 2}, + {"matrix": [5, 0], "x": 0, "y": 3}, + {"matrix": [5, 1], "x": 1, "y": 3}, + {"matrix": [5, 2], "x": 2, "y": 3}, + {"matrix": [5, 3], "x": 3, "y": 3}, + {"matrix": [5, 4], "x": 4, "y": 3}, + {"matrix": [5, 5], "x": 5, "y": 3}, + {"matrix": [8, 5], "x": 6, "y": 3}, + {"matrix": [8, 4], "x": 7, "y": 3}, + {"matrix": [8, 3], "x": 8, "y": 3}, + {"matrix": [8, 2], "x": 9, "y": 3}, + {"matrix": [8, 1], "x": 10, "y": 3}, + {"matrix": [8, 0], "x": 11, "y": 3}, + {"matrix": [6, 1], "x": 0.5, "y": 4}, + {"matrix": [6, 2], "x": 1.5, "y": 4}, + {"matrix": [6, 3], "x": 2.5, "y": 4}, + {"matrix": [6, 4], "x": 3.5, "y": 4, "w": 1.25}, + {"matrix": [6, 5], "x": 4.75, "y": 4, "w": 1.25}, + {"matrix": [9, 5], "x": 6, "y": 4, "w": 1.25}, + {"matrix": [9, 4], "x": 7.25, "y": 4, "w": 1.25}, + {"matrix": [9, 3], "x": 8.5, "y": 4}, + {"matrix": [9, 2], "x": 9.5, "y": 4}, + {"matrix": [9, 1], "x": 10.5, "y": 4} + ] + } + } +} diff --git a/keyboards/slimorta/keymaps/default/keymap.c b/keyboards/slimorta/keymaps/default/keymap.c new file mode 100644 index 00000000000..44b10cc3c86 --- /dev/null +++ b/keyboards/slimorta/keymaps/default/keymap.c @@ -0,0 +1,27 @@ +// Copyright 2025 ASHIJANKEN (@ASHIJANKEN) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐ + * │ Esc │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ BS │ + * ├─────┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼─────┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ - │ + * ├─────┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼─────┤ + * │ Ctrl│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ + * ├─────┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼─────┤ + * │Shift│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │Shift│ + * └──┬──┴─┬─┴─┬─┴─┬─┴──┬┴───┼───┴┬──┴─┬─┴─┬─┴──┬┴───┬─┘ + * │LNG2|Alt│GUI│ │ SPC│ Ent│ │ │Ctrl│LNG1│ + * └────┴───┴───┴────┴────┴────┴────┴───┴────┴────┘ + */ + [0] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LNG2, KC_LALT, KC_LGUI, KC_NO, KC_SPC, KC_ENT, KC_NO, KC_NO, KC_LCTL, KC_LNG1 + ) +}; diff --git a/keyboards/slimorta/readme.md b/keyboards/slimorta/readme.md new file mode 100644 index 00000000000..b6ae191db09 --- /dev/null +++ b/keyboards/slimorta/readme.md @@ -0,0 +1,23 @@ +# Slimorta + +![slimorta](https://i.imgur.com/edsao2S.jpeg) + +Slimorta is a slim and portable ortholinear keyboard. + +* Keyboard Maintainer: [ASHIJANKEN](https://github.com/ASHIJANKEN) +* Hardware Supported: Slimorta PCB, ProMicro +* Hardware Availability: [PCB & Case Data](https://github.com/ASHIJANKEN/Slimorta) + +Make example for this keyboard (after setting up your build environment): + + make slimorta:default + +Flashing example for this keyboard: + + make slimorta:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +**Physical reset button**: Press the button on the PCB twice briefly. From 8a47896263d48d1bb4636225b5cc0db4a8aee077 Mon Sep 17 00:00:00 2001 From: JhaKob Date: Tue, 8 Jul 2025 06:03:12 +0000 Subject: [PATCH 29/37] [Keyboard] Add Monsgeek M2 (#25387) * Adding Monsgeek M2 keyboard * Update readme.md * Switch tab -> space * Addressing PR comments. - Removing values that are set to defaults - Updating readme verbiage - Using host nkro instead of usb force_nkro --- keyboards/monsgeek/m2/config.h | 35 +++ keyboards/monsgeek/m2/halconf.h | 21 ++ keyboards/monsgeek/m2/keyboard.json | 279 ++++++++++++++++++ .../monsgeek/m2/keymaps/default/keymap.c | 80 +++++ keyboards/monsgeek/m2/m2.c | 142 +++++++++ keyboards/monsgeek/m2/mcuconf.h | 24 ++ keyboards/monsgeek/m2/readme.md | 25 ++ 7 files changed, 606 insertions(+) create mode 100644 keyboards/monsgeek/m2/config.h create mode 100644 keyboards/monsgeek/m2/halconf.h create mode 100644 keyboards/monsgeek/m2/keyboard.json create mode 100644 keyboards/monsgeek/m2/keymaps/default/keymap.c create mode 100644 keyboards/monsgeek/m2/m2.c create mode 100644 keyboards/monsgeek/m2/mcuconf.h create mode 100644 keyboards/monsgeek/m2/readme.md diff --git a/keyboards/monsgeek/m2/config.h b/keyboards/monsgeek/m2/config.h new file mode 100644 index 00000000000..402c3e016ed --- /dev/null +++ b/keyboards/monsgeek/m2/config.h @@ -0,0 +1,35 @@ +/* Copyright (C) 2023 jonylee@hfd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/* LED Indicators */ +#define LED_WIN_LOCK_PIN C11 + +/* SPI Config for spi flash*/ +#define SPI_DRIVER SPIDQ +#define SPI_SCK_PIN B3 +#define SPI_MOSI_PIN B5 +#define SPI_MISO_PIN B4 +#define SPI_MOSI_PAL_MODE 5 + +#define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN C12 + +/* I2C Config for LED Driver */ +#define SNLED27351_I2C_ADDRESS_1 SNLED27351_I2C_ADDRESS_GND +#define SNLED27351_I2C_ADDRESS_2 SNLED27351_I2C_ADDRESS_VDDIO +#define I2C1_CLOCK_SPEED 400000 /* 400000 */ +#define I2C1_OPMODE OPMODE_I2C diff --git a/keyboards/monsgeek/m2/halconf.h b/keyboards/monsgeek/m2/halconf.h new file mode 100644 index 00000000000..b8ebdb3369a --- /dev/null +++ b/keyboards/monsgeek/m2/halconf.h @@ -0,0 +1,21 @@ +/* Copyright (C) 2023 jonylee@hfd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +#define HAL_USE_I2C TRUE +#define HAL_USE_SPI TRUE + +#include_next diff --git a/keyboards/monsgeek/m2/keyboard.json b/keyboards/monsgeek/m2/keyboard.json new file mode 100644 index 00000000000..be2fc7358a3 --- /dev/null +++ b/keyboards/monsgeek/m2/keyboard.json @@ -0,0 +1,279 @@ +{ + "manufacturer": "MonsGeek", + "keyboard_name": "M2", + "maintainer": "jonylee@hfd", + "bootloader": "wb32-dfu", + "diode_direction": "ROW2COL", + "dynamic_keymap": { + "layer_count": 6 + }, + "eeprom": { + "driver": "wear_leveling", + "wear_leveling": { + "backing_size": 8192, + "driver": "spi_flash" + } + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "host": { + "default": { + "nkro": true + } + }, + "indicators": { + "caps_lock": "A15", + "num_lock": "C10" + }, + "matrix_pins": { + "cols": ["C1", "C2", "C3", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "C4", "C5", "B0", "B1", "B2", "B10", "B11", "B12", "B13", "B14"], + "rows": ["B15", "C6", "C7", "C8", "C9", "A8"] + }, + "processor": "WB32FQ95", + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "rgb_matrix": { + "animations": { + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "dual_beacon": true, + "multisplash": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "raindrops": true, + "solid_reactive": true, + "solid_reactive_cross": true, + "solid_reactive_simple": true, + "typing_heatmap": true + }, + "driver": "snled27351", + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 1}, + {"matrix": [0, 1], "x": 13, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 26, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 39, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 52, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 65, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 79, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 92, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 105, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 118, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 131, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 144, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 158, "y": 0, "flags": 4}, + {"matrix": [0, 13], "x": 171, "y": 0, "flags": 1}, + {"matrix": [0, 17], "x": 184, "y": 0, "flags": 1}, + {"matrix": [0, 18], "x": 197, "y": 0, "flags": 1}, + {"matrix": [0, 19], "x": 210, "y": 0, "flags": 1}, + {"matrix": [0, 20], "x": 224, "y": 0, "flags": 1}, + {"matrix": [1, 0], "x": 0, "y": 12, "flags": 4}, + {"matrix": [1, 1], "x": 13, "y": 12, "flags": 4}, + {"matrix": [1, 2], "x": 26, "y": 12, "flags": 4}, + {"matrix": [1, 3], "x": 39, "y": 12, "flags": 4}, + {"matrix": [1, 4], "x": 52, "y": 12, "flags": 4}, + {"matrix": [1, 5], "x": 65, "y": 12, "flags": 4}, + {"matrix": [1, 6], "x": 79, "y": 12, "flags": 4}, + {"matrix": [1, 7], "x": 92, "y": 12, "flags": 4}, + {"matrix": [1, 8], "x": 105, "y": 12, "flags": 4}, + {"matrix": [1, 9], "x": 118, "y": 12, "flags": 4}, + {"matrix": [1, 10], "x": 131, "y": 12, "flags": 4}, + {"matrix": [1, 11], "x": 144, "y": 12, "flags": 4}, + {"matrix": [1, 12], "x": 158, "y": 12, "flags": 4}, + {"matrix": [1, 13], "x": 171, "y": 12, "flags": 1}, + {"matrix": [1, 17], "x": 184, "y": 12, "flags": 4}, + {"matrix": [1, 18], "x": 197, "y": 12, "flags": 4}, + {"matrix": [1, 19], "x": 210, "y": 12, "flags": 4}, + {"matrix": [1, 20], "x": 224, "y": 12, "flags": 4}, + {"matrix": [2, 0], "x": 0, "y": 25, "flags": 1}, + {"matrix": [2, 1], "x": 13, "y": 25, "flags": 4}, + {"matrix": [2, 2], "x": 26, "y": 25, "flags": 4}, + {"matrix": [2, 3], "x": 39, "y": 25, "flags": 4}, + {"matrix": [2, 4], "x": 52, "y": 25, "flags": 4}, + {"matrix": [2, 5], "x": 65, "y": 25, "flags": 4}, + {"matrix": [2, 6], "x": 79, "y": 25, "flags": 4}, + {"matrix": [2, 7], "x": 92, "y": 25, "flags": 4}, + {"matrix": [2, 8], "x": 105, "y": 25, "flags": 4}, + {"matrix": [2, 9], "x": 118, "y": 25, "flags": 4}, + {"matrix": [2, 10], "x": 131, "y": 25, "flags": 4}, + {"matrix": [2, 11], "x": 144, "y": 25, "flags": 4}, + {"matrix": [2, 12], "x": 158, "y": 25, "flags": 4}, + {"matrix": [2, 13], "x": 171, "y": 25, "flags": 1}, + {"matrix": [2, 17], "x": 184, "y": 25, "flags": 4}, + {"matrix": [2, 18], "x": 197, "y": 25, "flags": 4}, + {"matrix": [2, 19], "x": 210, "y": 25, "flags": 4}, + {"matrix": [2, 20], "x": 224, "y": 25, "flags": 4}, + {"matrix": [3, 0], "x": 0, "y": 38, "flags": 1}, + {"matrix": [3, 1], "x": 13, "y": 38, "flags": 4}, + {"matrix": [3, 2], "x": 26, "y": 38, "flags": 4}, + {"matrix": [3, 3], "x": 39, "y": 38, "flags": 4}, + {"matrix": [3, 4], "x": 52, "y": 38, "flags": 4}, + {"matrix": [3, 5], "x": 65, "y": 38, "flags": 4}, + {"matrix": [3, 6], "x": 79, "y": 38, "flags": 4}, + {"matrix": [3, 7], "x": 92, "y": 38, "flags": 4}, + {"matrix": [3, 8], "x": 105, "y": 38, "flags": 4}, + {"matrix": [3, 9], "x": 118, "y": 38, "flags": 4}, + {"matrix": [3, 10], "x": 131, "y": 38, "flags": 4}, + {"matrix": [3, 11], "x": 144, "y": 38, "flags": 4}, + {"matrix": [3, 13], "x": 163, "y": 38, "flags": 1}, + {"matrix": [3, 17], "x": 184, "y": 38, "flags": 4}, + {"matrix": [3, 18], "x": 197, "y": 38, "flags": 4}, + {"matrix": [3, 19], "x": 210, "y": 38, "flags": 4}, + {"matrix": [4, 0], "x": 0, "y": 51, "flags": 1}, + {"matrix": [4, 1], "x": 26, "y": 51, "flags": 4}, + {"matrix": [4, 2], "x": 39, "y": 51, "flags": 4}, + {"matrix": [4, 3], "x": 52, "y": 51, "flags": 4}, + {"matrix": [4, 4], "x": 65, "y": 51, "flags": 4}, + {"matrix": [4, 5], "x": 79, "y": 51, "flags": 4}, + {"matrix": [4, 6], "x": 92, "y": 51, "flags": 4}, + {"matrix": [4, 7], "x": 105, "y": 51, "flags": 4}, + {"matrix": [4, 8], "x": 118, "y": 51, "flags": 4}, + {"matrix": [4, 9], "x": 131, "y": 51, "flags": 4}, + {"matrix": [4, 10], "x": 144, "y": 51, "flags": 4}, + {"matrix": [4, 13], "x": 158, "y": 51, "flags": 1}, + {"matrix": [4, 15], "x": 171, "y": 51, "flags": 1}, + {"matrix": [4, 17], "x": 184, "y": 51, "flags": 4}, + {"matrix": [4, 18], "x": 197, "y": 51, "flags": 4}, + {"matrix": [4, 19], "x": 210, "y": 51, "flags": 4}, + {"matrix": [4, 20], "x": 224, "y": 51, "flags": 1}, + {"matrix": [5, 0], "x": 0, "y": 64, "flags": 1}, + {"matrix": [5, 1], "x": 18, "y": 64, "flags": 1}, + {"matrix": [5, 2], "x": 37, "y": 64, "flags": 1}, + {"matrix": [5, 5], "x": 92, "y": 64, "flags": 4}, + {"matrix": [5, 9], "x": 130, "y": 64, "flags": 1}, + {"matrix": [5, 10], "x": 145, "y": 64, "flags": 1}, + {"matrix": [5, 11], "x": 158, "y": 64, "flags": 1}, + {"matrix": [5, 15], "x": 171, "y": 64, "flags": 1}, + {"matrix": [5, 16], "x": 184, "y": 64, "flags": 1}, + {"matrix": [5, 18], "x": 197, "y": 64, "flags": 4}, + {"matrix": [5, 19], "x": 210, "y": 64, "flags": 4} + ], + "max_brightness": 200, + "sleep": true, + "val_steps": 20 + }, + "usb": { + "device_version": "1.0.4", + "pid": "0x0008", + "suspend_wakeup_delay": 400, + "vid": "0xFFFE" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"label": "Esc", "matrix": [0, 0], "x": 0, "y": 0}, + {"label": "F1", "matrix": [0, 1], "x": 1.25, "y": 0}, + {"label": "F2", "matrix": [0, 2], "x": 2.25, "y": 0}, + {"label": "F3", "matrix": [0, 3], "x": 3.25, "y": 0}, + {"label": "F4", "matrix": [0, 4], "x": 4.25, "y": 0}, + {"label": "F5", "matrix": [0, 5], "x": 5.5, "y": 0}, + {"label": "F6", "matrix": [0, 6], "x": 6.5, "y": 0}, + {"label": "F7", "matrix": [0, 7], "x": 7.5, "y": 0}, + {"label": "F8", "matrix": [0, 8], "x": 8.5, "y": 0}, + {"label": "F9", "matrix": [0, 9], "x": 9.75, "y": 0}, + {"label": "F10", "matrix": [0, 10], "x": 10.75, "y": 0}, + {"label": "F11", "matrix": [0, 11], "x": 11.75, "y": 0}, + {"label": "F12", "matrix": [0, 12], "x": 12.75, "y": 0}, + {"label": "Delete", "matrix": [0, 13], "x": 14, "y": 0}, + {"label": "PrtSc", "matrix": [0, 17], "x": 15.5, "y": 0}, + {"label": "Home", "matrix": [0, 18], "x": 16.5, "y": 0}, + {"label": "Pgup", "matrix": [0, 19], "x": 17.5, "y": 0}, + {"label": "Pgdn", "matrix": [0, 20], "x": 18.5, "y": 0}, + {"label": "~", "matrix": [1, 0], "x": 0, "y": 1.25}, + {"label": "!", "matrix": [1, 1], "x": 1, "y": 1.25}, + {"label": "@", "matrix": [1, 2], "x": 2, "y": 1.25}, + {"label": "#", "matrix": [1, 3], "x": 3, "y": 1.25}, + {"label": "$", "matrix": [1, 4], "x": 4, "y": 1.25}, + {"label": "%", "matrix": [1, 5], "x": 5, "y": 1.25}, + {"label": "^", "matrix": [1, 6], "x": 6, "y": 1.25}, + {"label": "&", "matrix": [1, 7], "x": 7, "y": 1.25}, + {"label": "*", "matrix": [1, 8], "x": 8, "y": 1.25}, + {"label": "(", "matrix": [1, 9], "x": 9, "y": 1.25}, + {"label": ")", "matrix": [1, 10], "x": 10, "y": 1.25}, + {"label": "_", "matrix": [1, 11], "x": 11, "y": 1.25}, + {"label": "+", "matrix": [1, 12], "x": 12, "y": 1.25}, + {"label": "Bksp", "matrix": [1, 13], "x": 13, "y": 1.25, "w": 2}, + {"label": "Numlock", "matrix": [1, 17], "x": 15.5, "y": 1.25}, + {"label": "/", "matrix": [1, 18], "x": 16.5, "y": 1.25}, + {"label": "*", "matrix": [1, 19], "x": 17.5, "y": 1.25}, + {"label": "-", "matrix": [1, 20], "x": 18.5, "y": 1.25}, + {"label": "Tab", "matrix": [2, 0], "x": 0, "y": 2.25, "w": 1.5}, + {"label": "Q", "matrix": [2, 1], "x": 1.5, "y": 2.25}, + {"label": "W", "matrix": [2, 2], "x": 2.5, "y": 2.25}, + {"label": "E", "matrix": [2, 3], "x": 3.5, "y": 2.25}, + {"label": "R", "matrix": [2, 4], "x": 4.5, "y": 2.25}, + {"label": "T", "matrix": [2, 5], "x": 5.5, "y": 2.25}, + {"label": "Y", "matrix": [2, 6], "x": 6.5, "y": 2.25}, + {"label": "U", "matrix": [2, 7], "x": 7.5, "y": 2.25}, + {"label": "I", "matrix": [2, 8], "x": 8.5, "y": 2.25}, + {"label": "O", "matrix": [2, 9], "x": 9.5, "y": 2.25}, + {"label": "P", "matrix": [2, 10], "x": 10.5, "y": 2.25}, + {"label": "{", "matrix": [2, 11], "x": 11.5, "y": 2.25}, + {"label": "}", "matrix": [2, 12], "x": 12.5, "y": 2.25}, + {"label": "|", "matrix": [2, 13], "x": 13.5, "y": 2.25, "w": 1.5}, + {"label": "7", "matrix": [2, 17], "x": 15.5, "y": 2.25}, + {"label": "8", "matrix": [2, 18], "x": 16.5, "y": 2.25}, + {"label": "9", "matrix": [2, 19], "x": 17.5, "y": 2.25}, + {"label": "+", "matrix": [2, 20], "x": 18.5, "y": 2.25, "h": 2}, + {"label": "Caps Lock", "matrix": [3, 0], "x": 0, "y": 3.25, "w": 1.75}, + {"label": "A", "matrix": [3, 1], "x": 1.75, "y": 3.25}, + {"label": "S", "matrix": [3, 2], "x": 2.75, "y": 3.25}, + {"label": "D", "matrix": [3, 3], "x": 3.75, "y": 3.25}, + {"label": "F", "matrix": [3, 4], "x": 4.75, "y": 3.25}, + {"label": "G", "matrix": [3, 5], "x": 5.75, "y": 3.25}, + {"label": "H", "matrix": [3, 6], "x": 6.75, "y": 3.25}, + {"label": "J", "matrix": [3, 7], "x": 7.75, "y": 3.25}, + {"label": "K", "matrix": [3, 8], "x": 8.75, "y": 3.25}, + {"label": "L", "matrix": [3, 9], "x": 9.75, "y": 3.25}, + {"label": ":", "matrix": [3, 10], "x": 10.75, "y": 3.25}, + {"label": "'", "matrix": [3, 11], "x": 11.75, "y": 3.25}, + {"label": "Enter", "matrix": [3, 13], "x": 12.75, "y": 3.25, "w": 2.25}, + {"label": "4", "matrix": [3, 17], "x": 15.5, "y": 3.25}, + {"label": "5", "matrix": [3, 18], "x": 16.5, "y": 3.25}, + {"label": "6", "matrix": [3, 19], "x": 17.5, "y": 3.25}, + {"label": "Shift", "matrix": [4, 0], "x": 0, "y": 4.25, "w": 2.25}, + {"label": "Z", "matrix": [4, 1], "x": 2.25, "y": 4.25}, + {"label": "X", "matrix": [4, 2], "x": 3.25, "y": 4.25}, + {"label": "C", "matrix": [4, 3], "x": 4.25, "y": 4.25}, + {"label": "V", "matrix": [4, 4], "x": 5.25, "y": 4.25}, + {"label": "B", "matrix": [4, 5], "x": 6.25, "y": 4.25}, + {"label": "N", "matrix": [4, 6], "x": 7.25, "y": 4.25}, + {"label": "M", "matrix": [4, 7], "x": 8.25, "y": 4.25}, + {"label": "<", "matrix": [4, 8], "x": 9.25, "y": 4.25}, + {"label": ">", "matrix": [4, 9], "x": 10.25, "y": 4.25}, + {"label": "?", "matrix": [4, 10], "x": 11.25, "y": 4.25}, + {"label": "Shift", "matrix": [4, 13], "x": 12.25, "y": 4.25, "w": 1.75}, + {"label": "Up", "matrix": [4, 15], "x": 14.25, "y": 4.5}, + {"label": "1", "matrix": [4, 17], "x": 15.5, "y": 4.25}, + {"label": "2", "matrix": [4, 18], "x": 16.5, "y": 4.25}, + {"label": "3", "matrix": [4, 19], "x": 17.5, "y": 4.25}, + {"label": "Enter", "matrix": [4, 20], "x": 18.5, "y": 4.25, "h": 2}, + {"label": "Ctrl", "matrix": [5, 0], "x": 0, "y": 5.25, "w": 1.25}, + {"label": "Win", "matrix": [5, 1], "x": 1.25, "y": 5.25, "w": 1.25}, + {"label": "Alt", "matrix": [5, 2], "x": 2.5, "y": 5.25, "w": 1.25}, + {"label": "Space", "matrix": [5, 5], "x": 3.75, "y": 5.25, "w": 6.25}, + {"label": "Alt", "matrix": [5, 9], "x": 10, "y": 5.25, "w": 1.5}, + {"label": "Fn", "matrix": [5, 10], "x": 11.5, "y": 5.25, "w": 1.5}, + {"label": "Left", "matrix": [5, 11], "x": 13.25, "y": 5.5}, + {"label": "Down", "matrix": [5, 15], "x": 14.25, "y": 5.5}, + {"label": "Right", "matrix": [5, 16], "x": 15.25, "y": 5.5}, + {"label": "0", "matrix": [5, 18], "x": 16.5, "y": 5.25}, + {"label": ".", "matrix": [5, 19], "x": 17.5, "y": 5.25} + ] + } + } +} diff --git a/keyboards/monsgeek/m2/keymaps/default/keymap.c b/keyboards/monsgeek/m2/keymaps/default/keymap.c new file mode 100644 index 00000000000..5515c3e6d3d --- /dev/null +++ b/keyboards/monsgeek/m2/keymaps/default/keymap.c @@ -0,0 +1,80 @@ +/* Copyright (C) 2023 jonylee@hfd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include QMK_KEYBOARD_H + +// clang-format off +enum __layers { + WIN_B, + WIN_WASD, + WIN_FN, + MAC_B, + MAC_WASD, + MAC_FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [WIN_B] = LAYOUT( /* Base */ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN), KC_LEFT, KC_DOWN,KC_RGHT, KC_P0, KC_PDOT), + + [WIN_WASD] = LAYOUT( /* WASD */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RIGHT,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_W, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MO(WIN_FN), KC_A, KC_S, KC_D, _______, _______), + + + [WIN_FN] = LAYOUT( /* FN */ + _______, KC_MYCM, KC_MAIL, KC_WSCH, KC_WHOM, KC_MSEL, KC_MPLY, KC_MPRV, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, + _______, _______, TG(WIN_WASD),_______,_______,_______,_______,_______, KC_INS, DF(MAC_B),KC_PSCR, _______, _______, RM_NEXT, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, + _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, GU_TOGG, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU, _______, _______), + + [MAC_B] = LAYOUT( /* Base */ + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, KC_F5, KC_F6, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT), + + [MAC_WASD] = LAYOUT( /* WASD */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RIGHT,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_W, _______, _______, _______, _______, + _______, _______, _______, _______, _______, MO(MAC_FN), KC_A, KC_S, KC_D, _______, _______), + + [MAC_FN] = LAYOUT( /* FN */ + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_SPDD, RM_SPDU, _______, _______, _______, _______, _______, + _______, _______, TG(MAC_WASD),_______,_______,_______,_______,_______, KC_INS, DF(WIN_B),KC_PSCR, _______, _______, RM_NEXT, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, RM_TOGG, _______, _______, RM_HUEU, _______, _______, _______, + _______, _______, _______, KC_CALC, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, RM_VALU, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, RM_SATD, RM_VALD, RM_SATU, _______, _______) + +}; diff --git a/keyboards/monsgeek/m2/m2.c b/keyboards/monsgeek/m2/m2.c new file mode 100644 index 00000000000..289c4b4e65d --- /dev/null +++ b/keyboards/monsgeek/m2/m2.c @@ -0,0 +1,142 @@ +/* Copyright (C) 2023 jonylee@hfd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "quantum.h" + +#ifdef RGB_MATRIX_ENABLE +const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {1, CB1_CA1, CB2_CA1, CB3_CA1}, + {1, CB1_CA2, CB2_CA2, CB3_CA2}, + {1, CB1_CA3, CB2_CA3, CB3_CA3}, + {1, CB1_CA4, CB2_CA4, CB3_CA4}, + {1, CB1_CA5, CB2_CA5, CB3_CA5}, + {1, CB1_CA6, CB2_CA6, CB3_CA6}, + {1, CB1_CA7, CB2_CA7, CB3_CA7}, + {1, CB1_CA8, CB2_CA8, CB3_CA8}, + {1, CB1_CA9, CB2_CA9, CB3_CA9}, + {1, CB1_CA10, CB2_CA10, CB3_CA10}, + {1, CB1_CA11, CB2_CA11, CB3_CA11}, + {1, CB1_CA12, CB2_CA12, CB3_CA12}, + {1, CB1_CA13, CB2_CA13, CB3_CA13}, + {1, CB1_CA14, CB2_CA14, CB3_CA14}, + {1, CB4_CA11, CB5_CA11, CB6_CA11}, + {1, CB4_CA12, CB5_CA12, CB6_CA12}, + {1, CB4_CA13, CB5_CA13, CB6_CA13}, + {1, CB4_CA14, CB5_CA14, CB6_CA14}, + + {0, CB1_CA1, CB2_CA1, CB3_CA1}, + {0, CB1_CA2, CB2_CA2, CB3_CA2}, + {0, CB1_CA3, CB2_CA3, CB3_CA3}, + {0, CB1_CA4, CB2_CA4, CB3_CA4}, + {0, CB1_CA5, CB2_CA5, CB3_CA5}, + {0, CB1_CA6, CB2_CA6, CB3_CA6}, + {0, CB1_CA7, CB2_CA7, CB3_CA7}, + {0, CB1_CA8, CB2_CA8, CB3_CA8}, + {0, CB1_CA9, CB2_CA9, CB3_CA9}, + {0, CB1_CA10, CB2_CA10, CB3_CA10}, + {0, CB1_CA11, CB2_CA11, CB3_CA11}, + {0, CB1_CA12, CB2_CA12, CB3_CA12}, + {0, CB1_CA13, CB2_CA13, CB3_CA13}, + {0, CB1_CA14, CB2_CA14, CB3_CA14}, + {1, CB4_CA4, CB5_CA4, CB6_CA4}, + {1, CB4_CA5, CB5_CA5, CB6_CA5}, + {1, CB4_CA6, CB5_CA6, CB6_CA6}, + {1, CB4_CA7, CB5_CA7, CB6_CA7}, + + {0, CB4_CA1, CB5_CA1, CB6_CA1}, + {0, CB4_CA2, CB5_CA2, CB6_CA2}, + {0, CB4_CA3, CB5_CA3, CB6_CA3}, + {0, CB4_CA4, CB5_CA4, CB6_CA4}, + {0, CB4_CA5, CB5_CA5, CB6_CA5}, + {0, CB4_CA6, CB5_CA6, CB6_CA6}, + {0, CB4_CA7, CB5_CA7, CB6_CA7}, + {0, CB4_CA8, CB5_CA8, CB6_CA8}, + {0, CB4_CA9, CB5_CA9, CB6_CA9}, + {0, CB4_CA10, CB5_CA10, CB6_CA10}, + {0, CB4_CA11, CB5_CA11, CB6_CA11}, + {0, CB4_CA12, CB5_CA12, CB6_CA12}, + {0, CB4_CA13, CB5_CA13, CB6_CA13}, + {0, CB4_CA14, CB5_CA14, CB6_CA14}, + {1, CB4_CA8, CB5_CA8, CB6_CA8}, + {1, CB4_CA9, CB5_CA9, CB6_CA9}, + {1, CB4_CA10, CB5_CA10, CB6_CA10}, + {1, CB7_CA7, CB8_CA7, CB9_CA7}, + + {0, CB7_CA1, CB8_CA1, CB9_CA1}, + {0, CB7_CA2, CB8_CA2, CB9_CA2}, + {0, CB7_CA3, CB8_CA3, CB9_CA3}, + {0, CB7_CA4, CB8_CA4, CB9_CA4}, + {0, CB7_CA5, CB8_CA5, CB9_CA5}, + {0, CB7_CA6, CB8_CA6, CB9_CA6}, + {0, CB7_CA7, CB8_CA7, CB9_CA7}, + {0, CB7_CA8, CB8_CA8, CB9_CA8}, + {0, CB7_CA9, CB8_CA9, CB9_CA9}, + {0, CB7_CA10, CB8_CA10, CB9_CA10}, + {0, CB7_CA11, CB8_CA11, CB9_CA11}, + {0, CB7_CA12, CB8_CA12, CB9_CA12}, + {0, CB7_CA13, CB8_CA13, CB9_CA13}, + {1, CB7_CA4, CB8_CA4, CB9_CA4}, + {1, CB7_CA5, CB8_CA5, CB9_CA5}, + {1, CB7_CA6, CB8_CA6, CB9_CA6}, + + {0, CB10_CA1, CB11_CA1, CB12_CA1}, + {0, CB10_CA2, CB11_CA2, CB12_CA2}, + {0, CB10_CA3, CB11_CA3, CB12_CA3}, + {0, CB10_CA4, CB11_CA4, CB12_CA4}, + {0, CB10_CA5, CB11_CA5, CB12_CA5}, + {0, CB10_CA6, CB11_CA6, CB12_CA6}, + {0, CB10_CA7, CB11_CA7, CB12_CA7}, + {0, CB10_CA8, CB11_CA8, CB12_CA8}, + {0, CB10_CA9, CB11_CA9, CB12_CA9}, + {0, CB10_CA10, CB11_CA10, CB12_CA10}, + {0, CB10_CA11, CB11_CA11, CB12_CA11}, + {0, CB10_CA12, CB11_CA12, CB12_CA12}, + {1, CB10_CA4, CB11_CA4, CB12_CA4}, + {1, CB10_CA7, CB11_CA7, CB12_CA7}, + {1, CB10_CA8, CB11_CA8, CB12_CA8}, + {1, CB10_CA9, CB11_CA9, CB12_CA9}, + {1, CB10_CA10, CB11_CA10, CB12_CA10}, + + {0, CB10_CA13, CB11_CA13, CB12_CA13}, + {0, CB10_CA14, CB11_CA14, CB12_CA14}, + {0, CB10_CA15, CB11_CA15, CB12_CA15}, + {0, CB10_CA16, CB11_CA16, CB12_CA16}, + {0, CB7_CA14, CB8_CA14, CB9_CA14}, + {0, CB7_CA15, CB8_CA15, CB9_CA15}, + {0, CB7_CA16, CB8_CA16, CB9_CA16}, + {1, CB10_CA2, CB11_CA2, CB12_CA2}, + {1, CB10_CA3, CB11_CA3, CB12_CA3}, + {1, CB10_CA5, CB11_CA5, CB12_CA5}, + {1, CB10_CA6, CB11_CA6, CB12_CA6}, +}; +#endif //RGB_MATRIX_ENABLE + +void keyboard_pre_init_kb(void) { + gpio_set_pin_output(LED_WIN_LOCK_PIN); // LED3 Win Lock + gpio_write_pin_low(LED_WIN_LOCK_PIN); + + keyboard_pre_init_user(); +} + +void housekeeping_task_kb(void) { + gpio_write_pin(LED_WIN_LOCK_PIN, keymap_config.no_gui); +} diff --git a/keyboards/monsgeek/m2/mcuconf.h b/keyboards/monsgeek/m2/mcuconf.h new file mode 100644 index 00000000000..e2884f3828f --- /dev/null +++ b/keyboards/monsgeek/m2/mcuconf.h @@ -0,0 +1,24 @@ +/* Copyright (C) 2023 jonylee@hfd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +#include_next + +#undef WB32_SPI_USE_QSPI +#define WB32_SPI_USE_QSPI TRUE + +#undef WB32_I2C_USE_I2C1 +#define WB32_I2C_USE_I2C1 TRUE diff --git a/keyboards/monsgeek/m2/readme.md b/keyboards/monsgeek/m2/readme.md new file mode 100644 index 00000000000..886103316f3 --- /dev/null +++ b/keyboards/monsgeek/m2/readme.md @@ -0,0 +1,25 @@ +# MonsGeek M2 +![M2](https://i.imgur.com/kv9ChJn.png) + +A customizable 95% keyboard + +* Keyboard Maintainer: [jonylee@hfd](https://github.com/jonylee1986) +* Hardware Supported: MonsGeek M2 PCB +* Hardware Availability: [monsgeek](https://www.monsgeek.com/product/m2/) + +Make example for this keyboard (after setting up your build environment): + + make monsgeek/m2:default + +Flashing example for this keyboard: + + make monsgeek/m2:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 2 ways: + +* **Bootmagic reset**: Hold down the top left key (commonly programmed as *Esc*) while plugging in the keyboard. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From c3b3f097022f3472e9fc7b4442803032b93c21e0 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 8 Jul 2025 13:17:33 -0600 Subject: [PATCH 30/37] [Docs] Tidy up keyboard guidelines (#25461) * Initial * Grammar --- docs/hardware_keyboard_guidelines.md | 70 +++++++++++++--------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md index 7f17c46748d..7e88ff231d2 100644 --- a/docs/hardware_keyboard_guidelines.md +++ b/docs/hardware_keyboard_guidelines.md @@ -44,7 +44,11 @@ QMK uses sub-folders both for organization and to share code between revisions o qmk_firmware/keyboards/top_folder/sub_1/sub_2/sub_3/sub_4 ``` -If a sub-folder has a `rules.mk` file it will be considered a compilable keyboard. It will be available in QMK Configurator and tested with `make all`. If you are using a folder to organize several keyboards from the same maker you should not have a `rules.mk` file. +If a sub-folder has a `keyboard.json` file it will be considered a compilable keyboard. It will be available in QMK Configurator and tested with `make all`. If you are using a folder to organize several keyboards from the same maker you should not have a `keyboard.json` file. + +::: tip +When configuring a keyboard with multiple revisions (like the `clueboard/66` example below), an `info.json` file at the top keyboard level (eg. `clueboard/66`) should be used for configuration shared between revisions. Then `keyboard.json` in each revision directory containing revision-specific configuration, and indicating a buildable keyboard. +::: Example: @@ -52,19 +56,19 @@ Clueboard uses sub-folders for both purposes, organization and keyboard revision * [`qmk_firmware`](https://github.com/qmk/qmk_firmware/tree/master) * [`keyboards`](https://github.com/qmk/qmk_firmware/tree/master/keyboards) - * [`clueboard`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard) ← This is the organization folder, there's no `rules.mk` file - * [`60`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/60) ← This is a compilable keyboard, it has a `rules.mk` file - * [`66`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66) ← This is also compilable- it uses `DEFAULT_FOLDER` to specify `rev3` as the default revision + * [`clueboard`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard) ← This is the organization folder, there's no `keyboard.json` file + * [`60`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/60) ← This is a compilable keyboard - it has a `keyboard.json` file + * [`66`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66) ← This is not a compilable keyboard - a revision must be specified * [`rev1`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev1) ← compilable: `make clueboard/66/rev1` * [`rev2`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev2) ← compilable: `make clueboard/66/rev2` - * [`rev3`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev3) ← compilable: `make clueboard/66/rev3` or `make clueboard/66` + * [`rev3`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev3) ← compilable: `make clueboard/66/rev3` ## Keyboard Folder Structure -Your keyboard should be located in `qmk_firmware/keyboards/` and the folder name should be your keyboard's name as described in the previous section. Inside this folder should be several files: +Your keyboard should be located in `qmk_firmware/keyboards/` and the folder name should be your keyboard's name as described in the previous section. Inside this folder should be several files, some of which are optional: * `readme.md` -* `info.json` +* `keyboard.json` (or `info.json`) * `config.h` * `rules.mk` * `.c` @@ -74,13 +78,27 @@ Your keyboard should be located in `qmk_firmware/keyboards/` and the folder name All projects need to have a `readme.md` file that explains what the keyboard is, who made it and where it's available. If applicable, it should also contain links to more information, such as the maker's website. Please follow the [published template](documentation_templates#keyboard-readmemd-template). -### `info.json` +### `keyboard.json`/`info.json` -This file is used by the [QMK API](https://github.com/qmk/qmk_api). It contains the information [QMK Configurator](https://config.qmk.fm/) needs to display a representation of your keyboard. You can also set metadata here. For more information see the [reference page](reference_info_json). +The `keyboard.json` file is necessary for your keyboard (or keyboard revision) to be considered a buildable keyboard. The same content is valid in both `info.json` and `keyboard.json`. For the available configuration options of this file, see the [reference page](reference_info_json). This file is also used by the [QMK API](https://github.com/qmk/qmk_api), and by the [QMK Configurator](https://config.qmk.fm/) to display a representation of the available layouts of your keyboard. + +Additionally, this is where layouts available on your keyboard are defined. If you only have a single layout, it should be named `LAYOUT`. When defining multiple layouts, you should have a base layout, named `LAYOUT_all`, that supports all possible switch positions in your matrix, even if that layout is impossible to build physically. This is the layout that should be used in the `default` keymap. You should then have additional keymaps named `default_` that configure keymaps for the other layouts. Layout macro names are entirely lowercase, except for the prefix of `LAYOUT`. + +As an example, if you have a 60% PCB that supports ANSI and ISO, you might define the following layouts and keymaps: + +| Layout Name | Keymap Name | Description | +|-------------|--------------|------------------------------------------| +| LAYOUT_all | default | A layout that supports both ISO and ANSI | +| LAYOUT_ansi | default_ansi | An ANSI layout | +| LAYOUT_iso | default_iso | An ISO layout | + +::: tip +Providing only `LAYOUT_all` is invalid, as is providing a `LAYOUT` when multiple layouts are present. +::: ### `config.h` -All projects need to have a `config.h` file that sets things like the matrix size, product name, USB VID/PID, description and other settings. In general, use this file to set essential information and defaults for your keyboard that will always work. +Some projects will need to have a `config.h` that configures parameters that are not possible to be set in `keyboard.json`. This is not a required file. The `config.h` files can also be placed in sub-folders, and the order in which they are read is as follows: @@ -138,7 +156,7 @@ If you define options using `post_config.h` as in the above example, you should ### `rules.mk` -The presence of this file means that the folder is a keyboard target and can be used in `make` commands. This is where you setup the build environment for your keyboard and configure the default set of features. +This file is typically used to configure hardware drivers (eg. pointing device), or to include additional C files in compilation. This is not a required file. The `rules.mk` file can also be placed in a sub-folder, and its reading order is as follows: @@ -187,7 +205,7 @@ See `build_keyboard.mk` and `common_features.mk` for more details. ### `` -This is where you will write custom code for your keyboard. Typically you will write code to initialize and interface with the hardware in your keyboard. If your keyboard consists of only a key matrix with no LEDs, speakers, or other auxiliary hardware this file can be blank. +This file should contain C code required for the functionality of your keyboard, for example hardware initialisation code, OLED display code, and so on. This file should only contain code necessary for the keyboard to work, and *not* things that should be left to the end user to configure in their keymap. This file is automatically included in compilation if it exists. This is not a required file. The following functions are typically defined in this file: @@ -198,31 +216,11 @@ The following functions are typically defined in this file: ### `` -This file is used to define the matrix for your keyboard. You should define at least one C macro which translates an array into a matrix representing the physical switch matrix for your keyboard. If it's possible to build your keyboard with multiple layouts you should define additional macros. - -If you have only a single layout you should call this macro `LAYOUT`. - -When defining multiple layouts you should have a base layout, named `LAYOUT_all`, that supports all possible switch positions on your matrix, even if that layout is impossible to build physically. This is the macro you should use in your `default` keymap. You should then have additional keymaps named `default_` that use your other layout macros. This will make it easier for people to use the layouts you define. - -Layout macro names are entirely lowercase, except for the word `LAYOUT` at the front. - -As an example, if you have a 60% PCB that supports ANSI and ISO you might define the following layouts and keymaps: - -| Layout Name | Keymap Name | Description | -|-------------|-------------|-------------| -| LAYOUT_all | default | A layout that supports both ISO and ANSI | -| LAYOUT_ansi | default_ansi | An ANSI layout | -| LAYOUT_iso | default_iso | An ISO layout | - -::: tip -Providing only `LAYOUT_all` is invalid - especially when implementing the additional layouts within 3rd party tooling. -::: +This file can contain function prototypes for custom functions and other header file code utilised by `.c`. The `.c` file should include this file. This is not a required file. ## Image/Hardware Files -In an effort to keep the repo size down we're no longer accepting binary files of any format, with few exceptions. Hosting them elsewhere (such as ) and linking them in the `readme.md` is preferred. - -Hardware files (such as plates, cases, pcb) can be contributed to the [qmk.fm repo](https://github.com/qmk/qmk.fm) and they will be made available on [qmk.fm](https://qmk.fm). Downloadable files are stored in `//` (name follows the same format as above) which are served at `https://qmk.fm//`, and pages are generated from `/_pages//` which are served at the same location (.md files are generated into .html files through Jekyll). Check out the `lets_split` folder for an example. +In an effort to keep the repo size down we do not accept binary files of any format, with few exceptions. Hosting them elsewhere (such as ) and linking them in the `readme.md` is preferred. Hardware files such as plates, cases, and PCBs can be published in a personal repository or elsewhere, and linked to by your keyboard's `readme.md` file. ## Keyboard Defaults @@ -232,8 +230,6 @@ Given the amount of functionality that QMK exposes it's very easy to confuse new [Magic Keycodes](keycodes_magic) and [Command](features/command) are two related features that allow a user to control their keyboard in non-obvious ways. We recommend you think long and hard about if you're going to enable either feature, and how you will expose this functionality. Keep in mind that users who want this functionality can enable it in their personal keymaps without affecting all the novice users who may be using your keyboard as their first programmable board. -By far the most common problem new users encounter is accidentally triggering Bootmagic while they're plugging in their keyboard. They're holding the keyboard by the bottom, unknowingly pressing in alt and spacebar, and then they find that these keys have been swapped on them. We recommend leaving this feature disabled by default, but if you do turn it on consider setting `BOOTMAGIC_KEY_SALT` to a key that is hard to press while plugging your keyboard in. - If your keyboard does not have 2 shift keys you should provide a working default for `IS_COMMAND`, even when you have set `COMMAND_ENABLE = no`. This will give your users a default to conform to if they do enable Command. ## Custom Keyboard Programming @@ -242,7 +238,7 @@ As documented on [Customizing Functionality](custom_quantum_functions) you can d ## Non-Production/Handwired Projects -We're happy to accept any project that uses QMK, including prototypes and handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder! +We're happy to accept any project that uses QMK, including handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder! ## Warnings as Errors From 87e5df1b9ef59440787d065a126b9368fae32c44 Mon Sep 17 00:00:00 2001 From: Andrew Cooney Date: Thu, 10 Jul 2025 07:02:08 -0400 Subject: [PATCH 31/37] Changes to the Stenography documentation page. (#25426) --- docs/features/stenography.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/features/stenography.md b/docs/features/stenography.md index 7fd245d59a6..4176344b5a3 100644 --- a/docs/features/stenography.md +++ b/docs/features/stenography.md @@ -4,6 +4,14 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-source program called Plover that provides real-time translation of steno strokes into words and commands. It has an established dictionary and supports +## Steno Support in QMK + +There are three ways that QMK keyboards can support steno, with varying degrees of configuration required: + +1. Plover with [Arpeggiation](https://plover.wiki/index.php/Glossary#Arpeggiate) requires no changes to any keyboard and is supported by QMK as well as any other QWERTY keyboard. +2. Plover with [NKRO](https://plover.wiki/index.php/Using_a_standard_keyboard_with_Plover#NKRO). If your keyboard supports NKRO in hardware and you have NKRO enabled as a USB endpoint, you can chord with the keyboard. Many devices will arrive stock like this and will require no changes. +3. Steno Machine Protocols. This requires the most configuration, but this has the advantage of allowing you to use your keyboard keys normally (either on another layer or another piece of hardware) without enabling and disabling your steno software. + ## Plover with QWERTY Keyboard {#plover-with-qwerty-keyboard} Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar. @@ -14,14 +22,14 @@ You may also need to adjust your layout, either in QMK or in Plover, if you have ## Plover with Steno Protocol {#plover-with-steno-protocol} -Plover also understands the language of several steno machines. QMK can speak a couple of these languages: TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`. +Plover also understands the language of several steno machines. QMK can speak a couple of these languages: TX Bolt and GeminiPR. An example layout can be found in `splitography/keymaps/default`. When QMK speaks to Plover over a steno protocol, Plover will not use the keyboard as input. This means that you can switch back and forth between a standard keyboard and your steno keyboard, or even switch layers from Plover to standard and back without needing to activate/deactivate Plover. In this mode, Plover expects to speak with a steno machine over a serial port so QMK will present itself to the operating system as a virtual serial port in addition to a keyboard. ::: info -Note: Due to hardware limitations, you might not be able to run both a virtual serial port and mouse emulation at the same time. +Due to hardware limitations, you might not be able to run both a virtual serial port and other features (mouse keys, NKRO, or MIDI support) at the same time. You will likely encounter a compile time error if this is the case. Disable those other features as necessary. ::: ::: warning @@ -156,7 +164,7 @@ At the end of this scenario given as an example, `chord` would have five bits se ## Keycode Reference {#keycode-reference} ::: info -Note: TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both. +TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both. ::: |GeminiPR|TX Bolt|Steno Key| From c3773d9c350cef5c4323c209f85ffd076177f8f1 Mon Sep 17 00:00:00 2001 From: TweyHugs <31876592+TweyHugs@users.noreply.github.com> Date: Fri, 11 Jul 2025 09:51:45 -0700 Subject: [PATCH 32/37] [Keyboard] Add cloud_macro (#24904) * Added cloud_macro to keyboards folder * Update readme.md * Update readme.md * Update readme.md * Add files via upload * Update keyboards/cloud_macro/keyboard.json Co-authored-by: Joel Challis * Update keyboards/cloud_macro/keymaps/default/keymap.c Co-authored-by: Joel Challis * Update keyboards/cloud_macro/keyboard.json Co-authored-by: Joel Challis * Update keyboards/cloud_macro/keyboard.json Co-authored-by: Joel Challis * Update readme.md * Update keyboards/cloud_macro/readme.md Co-authored-by: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> * Update keyboards/cloud_macro/keyboard.json Co-authored-by: jack * Update keyboards/cloud_macro/keymaps/default/keymap.c Co-authored-by: jack * Update keyboards/cloud_macro/readme.md Co-authored-by: jack * Update readme.md * Update readme.md reverting description to KB2040 --------- Co-authored-by: Joel Challis Co-authored-by: Thanh Son Tran <62438883+trnthsn@users.noreply.github.com> Co-authored-by: jack --- keyboards/cloud_macro/keyboard.json | 33 +++++++++++++++++++ .../cloud_macro/keymaps/default/keymap.c | 8 +++++ keyboards/cloud_macro/readme.md | 27 +++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 keyboards/cloud_macro/keyboard.json create mode 100644 keyboards/cloud_macro/keymaps/default/keymap.c create mode 100644 keyboards/cloud_macro/readme.md diff --git a/keyboards/cloud_macro/keyboard.json b/keyboards/cloud_macro/keyboard.json new file mode 100644 index 00000000000..1fe45a20a34 --- /dev/null +++ b/keyboards/cloud_macro/keyboard.json @@ -0,0 +1,33 @@ +{ + "manufacturer": "Trey Wax", + "keyboard_name": "cloud_macro", + "maintainer": "TweyHugs", + "development_board": "kb2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true + }, + "matrix_pins": { + "direct":[ + ["GP2", "GP3", "GP4", "GP5", "GP6"] + ] + }, + "usb": { + "device_version": "1.0.0", + "pid": "0x0000", + "vid": "0xFEED" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0}, + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 4], "x": 4, "y": 0} + ] + } + } +} diff --git a/keyboards/cloud_macro/keymaps/default/keymap.c b/keyboards/cloud_macro/keymaps/default/keymap.c new file mode 100644 index 00000000000..866c98f9723 --- /dev/null +++ b/keyboards/cloud_macro/keymaps/default/keymap.c @@ -0,0 +1,8 @@ +// Copyright 2023 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT(KC_1, KC_2, KC_3, KC_4, KC_5) +}; diff --git a/keyboards/cloud_macro/readme.md b/keyboards/cloud_macro/readme.md new file mode 100644 index 00000000000..4f45227160d --- /dev/null +++ b/keyboards/cloud_macro/readme.md @@ -0,0 +1,27 @@ +# cloud_macro + +![cloud_macro](https://i.imgur.com/n0PMttQ.jpeg) + +A 5 key macropad in the shape of a cloud + +* Keyboard Maintainer: [Trey Wax](https://github.com/TweyHugs) +* Hardware Supported: Adafruit KB2040 +* Hardware Availability: *https://circuitrey.carrd.co/* + +Make example for this keyboard (after setting up your build environment): + + make cloud_macro:default + +Flashing example for this keyboard: + + make cloud_macro:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available From 9e757bc2ecc09a48dcde351e8d3e31f02c05e4e7 Mon Sep 17 00:00:00 2001 From: Jon Henry Fernandez Date: Fri, 11 Jul 2025 22:29:16 -0500 Subject: [PATCH 33/37] [Keyboard] Add togkey/pad_pocket (#25470) * Initial Source for Pad Pocket * Added Tap Dance and Combo Configurations * Updated LED Count * Updated read me * Updated Readme * -Removed config.h file - Added tap dance and combos to keymap level - Removed tap dance and combos from keyboard.json - Fixed conflict with submodules * Fixed Formatting --- keyboards/togkey/pad_pocket/keyboard.json | 49 +++++++++++++++++++ .../pad_pocket/keymaps/default/keymap.c | 29 +++++++++++ .../pad_pocket/keymaps/default/rules.mk | 2 + keyboards/togkey/pad_pocket/readme.md | 27 ++++++++++ 4 files changed, 107 insertions(+) create mode 100644 keyboards/togkey/pad_pocket/keyboard.json create mode 100644 keyboards/togkey/pad_pocket/keymaps/default/keymap.c create mode 100644 keyboards/togkey/pad_pocket/keymaps/default/rules.mk create mode 100644 keyboards/togkey/pad_pocket/readme.md diff --git a/keyboards/togkey/pad_pocket/keyboard.json b/keyboards/togkey/pad_pocket/keyboard.json new file mode 100644 index 00000000000..9f9d5a3aea7 --- /dev/null +++ b/keyboards/togkey/pad_pocket/keyboard.json @@ -0,0 +1,49 @@ +{ + "manufacturer": "TogKey", + "keyboard_name": "Pad Pocket", + "maintainer": "togkey86", + "development_board": "promicro_rp2040", + "diode_direction": "COL2ROW", + "features": { + "bootmagic": true, + "extrakey": true, + "rgblight": true + }, + "matrix_pins": { + "cols": ["GP29", "GP22"], + "rows": ["GP26"] + }, + "rgblight": { + "animations": { + "alternating": true, + "breathing": true, + "christmas": true, + "knight": true, + "rainbow_mood": true, + "rainbow_swirl": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "hue_steps": 10, + "led_count": 2 + }, + "url": "https://togkey.com/products/togkey-pad-pocket", + "usb": { + "device_version": "1.0.0", + "pid": "0x8688", + "vid": "0xFEED" + }, + "ws2812": { + "driver": "vendor", + "pin": "GP21" + }, + "layouts": { + "LAYOUT": { + "layout": [ + {"matrix": [0, 0], "x": 0, "y": 0}, + {"matrix": [0, 1], "x": 1, "y": 0} + ] + } + } +} diff --git a/keyboards/togkey/pad_pocket/keymaps/default/keymap.c b/keyboards/togkey/pad_pocket/keymaps/default/keymap.c new file mode 100644 index 00000000000..500597eb087 --- /dev/null +++ b/keyboards/togkey/pad_pocket/keymaps/default/keymap.c @@ -0,0 +1,29 @@ +// Copyright 2025 TogKey +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +//Tap Dances +enum { + TD_VOLDOWN_MEDIAPREV, + TD_VOLUP_MEDIANEXT +}; + +tap_dance_action_t tap_dance_actions[] = { + [TD_VOLDOWN_MEDIAPREV] = ACTION_TAP_DANCE_DOUBLE(KC_AUDIO_VOL_DOWN, KC_MEDIA_PREV_TRACK), + [TD_VOLUP_MEDIANEXT] = ACTION_TAP_DANCE_DOUBLE(KC_AUDIO_VOL_UP, KC_MEDIA_NEXT_TRACK) +}; + +//Combos +const uint16_t PROGMEM media_combo[] = {TD(TD_VOLDOWN_MEDIAPREV), TD(TD_VOLUP_MEDIANEXT), COMBO_END}; + +combo_t key_combos[] = { + COMBO(media_combo, KC_MEDIA_PLAY_PAUSE) +}; + +//Keymap +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + TD(TD_VOLDOWN_MEDIAPREV), TD(TD_VOLUP_MEDIANEXT) + ) +}; diff --git a/keyboards/togkey/pad_pocket/keymaps/default/rules.mk b/keyboards/togkey/pad_pocket/keymaps/default/rules.mk new file mode 100644 index 00000000000..7981fd23ac7 --- /dev/null +++ b/keyboards/togkey/pad_pocket/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +COMBO_ENABLE = yes +TAP_DANCE_ENABLE = yes diff --git a/keyboards/togkey/pad_pocket/readme.md b/keyboards/togkey/pad_pocket/readme.md new file mode 100644 index 00000000000..160d698ad68 --- /dev/null +++ b/keyboards/togkey/pad_pocket/readme.md @@ -0,0 +1,27 @@ +# pad_pocket + +![pad_pocket](https://i.imgur.com/yCrqAe5.jpeg) + +A simple 2-Key Macropad Keychain based off an RP2040 Development Board and a custom PCB that is pre-programmed to control media. + +* Keyboard Maintainer: [Jon Henry](https://github.com/togkey86) +* Hardware Supported: Togkey Pad Pocket/Duo PCB, RP2040 Pro Micro Development Board +* Hardware Availability: (https://togkey.com) + +Make example for this keyboard (after setting up your build environment): + + make togkey/pad_pocket:default + +Flashing example for this keyboard: + + make togkey/pad_pocket:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (The left key closest to the USB Port) and plug in the keyboard +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From c7a24a441f6b3e25b726089c3305ef2d92b46fd4 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 12 Jul 2025 16:56:32 +0100 Subject: [PATCH 34/37] Add zip to .gitignore (#25483) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 20e706a2b59..5886640d688 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ build/ cmake-build-debug CMakeLists.txt *.pdf +*.zip # Let these ones be user specific, since we have so many different configurations *.code-workspace From 86badb394e338aa2def4d1caf77089ce0acf03e9 Mon Sep 17 00:00:00 2001 From: Jack Sangdahl Date: Sat, 12 Jul 2025 19:38:32 -0600 Subject: [PATCH 35/37] Enable correct SPI peripheral `dilemma/3x5_2/assembled` (#25479) Initial --- keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h b/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h index 81821c159dc..52b726a56d5 100644 --- a/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h +++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/mcuconf.h @@ -19,5 +19,5 @@ #include_next -#undef RP_SPI_USE_SPI1 -#define RP_SPI_USE_SPI1 TRUE +#undef RP_SPI_USE_SPI0 +#define RP_SPI_USE_SPI0 TRUE From 16ffaa6482e741380f5001f9a2cbb2b81520cebe Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 17 Jul 2025 11:09:01 -0600 Subject: [PATCH 36/37] Add `null65iso` keyboard (#25465) --- .../nulldesignco/null65iso/v1/keyboard.json | 240 ++++++++++++++++++ .../null65iso/v1/keymaps/default/keymap.c | 22 ++ keyboards/nulldesignco/null65iso/v1/readme.md | 27 ++ 3 files changed, 289 insertions(+) create mode 100755 keyboards/nulldesignco/null65iso/v1/keyboard.json create mode 100755 keyboards/nulldesignco/null65iso/v1/keymaps/default/keymap.c create mode 100755 keyboards/nulldesignco/null65iso/v1/readme.md diff --git a/keyboards/nulldesignco/null65iso/v1/keyboard.json b/keyboards/nulldesignco/null65iso/v1/keyboard.json new file mode 100755 index 00000000000..6b40b2e0d11 --- /dev/null +++ b/keyboards/nulldesignco/null65iso/v1/keyboard.json @@ -0,0 +1,240 @@ +{ + "manufacturer": "nulldesignco", + "keyboard_name": "null65iso", + "maintainer": "quark-works", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "vid": "0x6E6C", + "pid": "0x0010", + "device_version": "1.0.0" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "ws2812": { + "pin": "GP18", + "driver": "vendor" + }, + "rgb_matrix": { + "max_brightness": 90, + "center_point": [120,32], + "sleep": true, + "driver": "ws2812", + "animations": { + "alphas_mods": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_sat": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "band_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "flower_blooming": true, + "gradient_left_right": true, + "gradient_up_down": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "jellybean_raindrops": true, + "multisplash": true, + "pixel_flow": true, + "pixel_fractal": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": true, + "riverflow": true, + "solid_multisplash": true, + "solid_reactive": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_nexus": true, + "solid_reactive_simple": true, + "solid_reactive_wide": true, + "solid_splash": true, + "splash": true, + "starlight": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true, + "typing_heatmap": true + }, + "layout": [ + {"matrix": [4, 6], "x": 102, "y": 64, "flags": 4}, + + {"matrix": [4, 9], "x": 102, "y": 64, "flags": 4}, + {"matrix": [4, 10], "x": 160, "y": 64, "flags": 4}, + {"matrix": [4, 11], "x": 176, "y": 64, "flags": 4}, + {"matrix": [4, 12], "x": 192, "y": 64, "flags": 4}, + {"matrix": [4, 13], "x": 208, "y": 64, "flags": 4}, + {"matrix": [4, 14], "x": 240, "y": 64, "flags": 4}, + + {"matrix": [3, 14], "x": 240, "y": 48, "flags": 4}, + {"matrix": [3, 13], "x": 224, "y": 48, "flags": 4}, + {"matrix": [3, 12], "x": 202, "y": 48, "flags": 4}, + {"matrix": [3, 11], "x": 180, "y": 48, "flags": 4}, + {"matrix": [3, 10], "x": 164, "y": 48, "flags": 4}, + {"matrix": [3, 9], "x": 148, "y": 48, "flags": 4}, + {"matrix": [3, 8], "x": 132, "y": 48, "flags": 4}, + {"matrix": [3, 7], "x": 116, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 100, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 84, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 68, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 52, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 36, "y": 48, "flags": 4}, + + + {"matrix": [4, 2], "x": 42, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 22, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 2, "y": 64, "flags": 4}, + + {"matrix": [3, 1], "x": 20, "y": 48, "flags": 4}, + {"matrix": [3, 0], "x": 2, "y": 48, "flags": 4}, + + {"matrix": [2, 0], "x": 6, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 28, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 44, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 60, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 76, "y": 32, "flags": 4}, + {"matrix": [2, 5], "x": 92, "y": 32, "flags": 4}, + {"matrix": [2, 6], "x": 108, "y": 32, "flags": 4}, + {"matrix": [2, 7], "x": 124, "y": 32, "flags": 4}, + {"matrix": [2, 8], "x": 140, "y": 32, "flags": 4}, + {"matrix": [2, 9], "x": 156, "y": 32, "flags": 4}, + {"matrix": [2, 10], "x": 172, "y": 32, "flags": 4}, + {"matrix": [2, 11], "x": 188, "y": 32, "flags": 4}, + {"matrix": [2, 12], "x": 214, "y": 32, "flags": 4}, + {"matrix": [2, 14], "x": 240, "y": 32, "flags": 4}, + + {"matrix": [1, 14], "x": 240, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 220, "y": 24, "flags": 4}, + {"matrix": [1, 12], "x": 200, "y": 16, "flags": 4}, + {"matrix": [1, 11], "x": 184, "y": 16, "flags": 4}, + {"matrix": [1, 10], "x": 168, "y": 16, "flags": 4}, + {"matrix": [1, 9], "x": 152, "y": 16, "flags": 4}, + {"matrix": [1, 8], "x": 136, "y": 16, "flags": 4}, + {"matrix": [1, 7], "x": 120, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 104, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 88, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 72, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 56, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 40, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 24, "y": 16, "flags": 4}, + {"matrix": [1, 0], "x": 4, "y": 16, "flags": 4}, + + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 96, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 128, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 144, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 160, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 176, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 192, "y": 0, "flags": 4}, + {"matrix": [0, 13], "x": 216, "y": 0, "flags": 4}, + {"matrix": [0, 14], "x": 240, "y": 0, "flags": 4} + ] + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "rows": ["GP4", "GP3", "GP2", "GP17", "GP15"], + "cols": ["GP28", "GP27", "GP29", "GP0", "GP1", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP5"] + }, + "url": "https://nulldesignco.com/", + "community_layouts": ["65_iso"], + "layouts": { + "LAYOUT_65_iso": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0 }, + { "matrix": [0, 1], "x": 1, "y": 0 }, + { "matrix": [0, 2], "x": 2, "y": 0 }, + { "matrix": [0, 3], "x": 3, "y": 0 }, + { "matrix": [0, 4], "x": 4, "y": 0 }, + { "matrix": [0, 5], "x": 5, "y": 0 }, + { "matrix": [0, 6], "x": 6, "y": 0 }, + { "matrix": [0, 7], "x": 7, "y": 0 }, + { "matrix": [0, 8], "x": 8, "y": 0 }, + { "matrix": [0, 9], "x": 9, "y": 0 }, + { "matrix": [0, 10], "x": 10, "y": 0 }, + { "matrix": [0, 11], "x": 11, "y": 0 }, + { "matrix": [0, 12], "x": 12, "y": 0 }, + { "matrix": [0, 13], "w": 2, "x": 13, "y": 0 }, + { "matrix": [0, 14], "x": 15, "y": 0 }, + { "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 }, + { "matrix": [1, 1], "x": 1.5, "y": 1 }, + { "matrix": [1, 2], "x": 2.5, "y": 1 }, + { "matrix": [1, 3], "x": 3.5, "y": 1 }, + { "matrix": [1, 4], "x": 4.5, "y": 1 }, + { "matrix": [1, 5], "x": 5.5, "y": 1 }, + { "matrix": [1, 6], "x": 6.5, "y": 1 }, + { "matrix": [1, 7], "x": 7.5, "y": 1 }, + { "matrix": [1, 8], "x": 8.5, "y": 1 }, + { "matrix": [1, 9], "x": 9.5, "y": 1 }, + { "matrix": [1, 10], "x": 10.5, "y": 1 }, + { "matrix": [1, 11], "x": 11.5, "y": 1 }, + { "matrix": [1, 12], "x": 12.5, "y": 1 }, + { "matrix": [1, 14], "x": 15, "y": 1 }, + { "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 }, + { "matrix": [2, 1], "x": 1.75, "y": 2 }, + { "matrix": [2, 2], "x": 2.75, "y": 2 }, + { "matrix": [2, 3], "x": 3.75, "y": 2 }, + { "matrix": [2, 4], "x": 4.75, "y": 2 }, + { "matrix": [2, 5], "x": 5.75, "y": 2 }, + { "matrix": [2, 6], "x": 6.75, "y": 2 }, + { "matrix": [2, 7], "x": 7.75, "y": 2 }, + { "matrix": [2, 8], "x": 8.75, "y": 2 }, + { "matrix": [2, 9], "x": 9.75, "y": 2 }, + { "matrix": [2, 10], "x": 10.75, "y": 2 }, + { "matrix": [2, 11], "x": 11.75, "y": 2 }, + { "matrix": [2, 12], "x": 12.75, "y": 2 }, + { "matrix": [1, 13], "w": 1.25, "x": 13.75, "y": 1, "h": 2 }, + { "matrix": [2, 14], "x": 15, "y": 2 }, + { "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 }, + { "matrix": [3, 1], "x": 1.25, "y": 3 }, + { "matrix": [3, 2], "x": 2.25, "y": 3 }, + { "matrix": [3, 3], "x": 3.25, "y": 3 }, + { "matrix": [3, 4], "x": 4.25, "y": 3 }, + { "matrix": [3, 5], "x": 5.25, "y": 3 }, + { "matrix": [3, 6], "x": 6.25, "y": 3 }, + { "matrix": [3, 7], "x": 7.25, "y": 3 }, + { "matrix": [3, 8], "x": 8.25, "y": 3 }, + { "matrix": [3, 9], "x": 9.25, "y": 3 }, + { "matrix": [3, 10], "x": 10.25, "y": 3 }, + { "matrix": [3, 11], "x": 11.25, "y": 3 }, + { "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3 }, + { "matrix": [3, 13], "x": 14, "y": 3 }, + { "matrix": [3, 14], "x": 15, "y": 3 }, + { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 }, + { "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 }, + { "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 }, + { "matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4 }, + { "matrix": [4, 9], "x": 10, "y": 4 }, + { "matrix": [4, 10], "x": 11, "y": 4 }, + { "matrix": [4, 11], "x": 12, "y": 4 }, + { "matrix": [4, 12], "x": 13, "y": 4 }, + { "matrix": [4, 13], "x": 14, "y": 4 }, + { "matrix": [4, 14], "x": 15, "y": 4 } + ] + } + } +} diff --git a/keyboards/nulldesignco/null65iso/v1/keymaps/default/keymap.c b/keyboards/nulldesignco/null65iso/v1/keymaps/default/keymap.c new file mode 100755 index 00000000000..c360ef0e8a5 --- /dev/null +++ b/keyboards/nulldesignco/null65iso/v1/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +// Copyright 2025 quark-works +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_65_iso( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_HOME, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; + +bool rgb_matrix_indicators_user(void) { + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color(25, 255, 0, 0); + } + return false; +} diff --git a/keyboards/nulldesignco/null65iso/v1/readme.md b/keyboards/nulldesignco/null65iso/v1/readme.md new file mode 100755 index 00000000000..f7fdeac1317 --- /dev/null +++ b/keyboards/nulldesignco/null65iso/v1/readme.md @@ -0,0 +1,27 @@ +# null65iso v1 + +![sp](https://i.imgur.com/dypoXbB.png) + +65% tray mount PCB with RGB per key. + +* Keyboard Maintainer: [Quark](https://github.com/quark-works) +* Hardware Supported: PCB +* Hardware Availability: https://nulldesignco.com/ + +Make example for this keyboard (after setting up your build environment): + + make nulldesignco/null65iso/v1:default + +Flashing example for this keyboard: + + make nulldesignco/null65iso/v1:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical boot button**: Hold the button labeled as "BOOT" on the back of the board or short the two pads on the front while you connect the keyboard to your computer. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file From 7098252252ad17e14118d06da14d7fe62d807f83 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 17 Jul 2025 11:09:17 -0600 Subject: [PATCH 37/37] Add `null65ansi` keyboard (#25464) --- .../nulldesignco/null65ansi/v1/keyboard.json | 237 ++++++++++++++++++ .../null65ansi/v1/keymaps/default/keymap.c | 22 ++ .../nulldesignco/null65ansi/v1/readme.md | 27 ++ 3 files changed, 286 insertions(+) create mode 100755 keyboards/nulldesignco/null65ansi/v1/keyboard.json create mode 100755 keyboards/nulldesignco/null65ansi/v1/keymaps/default/keymap.c create mode 100755 keyboards/nulldesignco/null65ansi/v1/readme.md diff --git a/keyboards/nulldesignco/null65ansi/v1/keyboard.json b/keyboards/nulldesignco/null65ansi/v1/keyboard.json new file mode 100755 index 00000000000..8fb03934940 --- /dev/null +++ b/keyboards/nulldesignco/null65ansi/v1/keyboard.json @@ -0,0 +1,237 @@ +{ + "manufacturer": "nulldesignco", + "keyboard_name": "null65ansi", + "maintainer": "quark-works", + "processor": "RP2040", + "bootloader": "rp2040", + "usb": { + "vid": "0x6E6C", + "pid": "0x0001", + "device_version": "1.0.0" + }, + "features": { + "bootmagic": true, + "extrakey": true, + "mousekey": true, + "nkro": true, + "rgb_matrix": true + }, + "ws2812": { + "pin": "GP18", + "driver": "vendor" + }, + "rgb_matrix": { + "max_brightness": 90, + "center_point": [120,32], + "sleep": true, + "driver": "ws2812", + "animations": { + "alphas_mods": true, + "band_pinwheel_sat": true, + "band_pinwheel_val": true, + "band_sat": true, + "band_spiral_sat": true, + "band_spiral_val": true, + "band_val": true, + "breathing": true, + "cycle_all": true, + "cycle_left_right": true, + "cycle_out_in": true, + "cycle_out_in_dual": true, + "cycle_pinwheel": true, + "cycle_spiral": true, + "cycle_up_down": true, + "digital_rain": true, + "dual_beacon": true, + "flower_blooming": true, + "gradient_left_right": true, + "gradient_up_down": true, + "hue_breathing": true, + "hue_pendulum": true, + "hue_wave": true, + "jellybean_raindrops": true, + "multisplash": true, + "pixel_flow": true, + "pixel_fractal": true, + "pixel_rain": true, + "rainbow_beacon": true, + "rainbow_moving_chevron": true, + "rainbow_pinwheels": true, + "raindrops": true, + "riverflow": true, + "solid_multisplash": true, + "solid_reactive": true, + "solid_reactive_cross": true, + "solid_reactive_multicross": true, + "solid_reactive_multinexus": true, + "solid_reactive_multiwide": true, + "solid_reactive_nexus": true, + "solid_reactive_simple": true, + "solid_reactive_wide": true, + "solid_splash": true, + "splash": true, + "starlight": true, + "starlight_dual_hue": true, + "starlight_dual_sat": true, + "typing_heatmap": true + }, + "layout": [ + {"matrix": [4, 5], "x": 102, "y": 64, "flags": 4}, + + {"matrix": [4, 9], "x": 102, "y": 64, "flags": 4}, + {"matrix": [4, 10], "x": 160, "y": 64, "flags": 4}, + {"matrix": [4, 11], "x": 176, "y": 64, "flags": 4}, + {"matrix": [4, 12], "x": 192, "y": 64, "flags": 4}, + {"matrix": [4, 13], "x": 208, "y": 64, "flags": 4}, + {"matrix": [4, 14], "x": 240, "y": 64, "flags": 4}, + + {"matrix": [3, 14], "x": 240, "y": 48, "flags": 4}, + {"matrix": [3, 13], "x": 224, "y": 48, "flags": 4}, + {"matrix": [3, 12], "x": 202, "y": 48, "flags": 4}, + {"matrix": [3, 10], "x": 180, "y": 48, "flags": 4}, + {"matrix": [3, 9], "x": 164, "y": 48, "flags": 4}, + {"matrix": [3, 8], "x": 148, "y": 48, "flags": 4}, + {"matrix": [3, 7], "x": 132, "y": 48, "flags": 4}, + {"matrix": [3, 6], "x": 116, "y": 48, "flags": 4}, + {"matrix": [3, 5], "x": 100, "y": 48, "flags": 4}, + {"matrix": [3, 4], "x": 84, "y": 48, "flags": 4}, + {"matrix": [3, 3], "x": 68, "y": 48, "flags": 4}, + {"matrix": [3, 2], "x": 52, "y": 48, "flags": 4}, + {"matrix": [3, 1], "x": 36, "y": 48, "flags": 4}, + + {"matrix": [4, 2], "x": 42, "y": 64, "flags": 4}, + {"matrix": [4, 1], "x": 22, "y": 64, "flags": 4}, + {"matrix": [4, 0], "x": 2, "y": 64, "flags": 4}, + + {"matrix": [3, 0], "x": 10, "y": 48, "flags": 4}, + + {"matrix": [2, 0], "x": 6, "y": 32, "flags": 4}, + {"matrix": [2, 1], "x": 28, "y": 32, "flags": 4}, + {"matrix": [2, 2], "x": 44, "y": 32, "flags": 4}, + {"matrix": [2, 3], "x": 60, "y": 32, "flags": 4}, + {"matrix": [2, 4], "x": 76, "y": 32, "flags": 4}, + {"matrix": [2, 5], "x": 92, "y": 32, "flags": 4}, + {"matrix": [2, 6], "x": 108, "y": 32, "flags": 4}, + {"matrix": [2, 7], "x": 124, "y": 32, "flags": 4}, + {"matrix": [2, 8], "x": 140, "y": 32, "flags": 4}, + {"matrix": [2, 9], "x": 156, "y": 32, "flags": 4}, + {"matrix": [2, 10], "x": 172, "y": 32, "flags": 4}, + {"matrix": [2, 11], "x": 188, "y": 32, "flags": 4}, + {"matrix": [2, 13], "x": 214, "y": 32, "flags": 4}, + {"matrix": [2, 14], "x": 240, "y": 32, "flags": 4}, + + {"matrix": [1, 14], "x": 240, "y": 16, "flags": 4}, + {"matrix": [1, 13], "x": 220, "y": 16, "flags": 4}, + {"matrix": [1, 12], "x": 200, "y": 16, "flags": 4}, + {"matrix": [1, 11], "x": 184, "y": 16, "flags": 4}, + {"matrix": [1, 10], "x": 168, "y": 16, "flags": 4}, + {"matrix": [1, 9], "x": 152, "y": 16, "flags": 4}, + {"matrix": [1, 8], "x": 136, "y": 16, "flags": 4}, + {"matrix": [1, 7], "x": 120, "y": 16, "flags": 4}, + {"matrix": [1, 6], "x": 104, "y": 16, "flags": 4}, + {"matrix": [1, 5], "x": 88, "y": 16, "flags": 4}, + {"matrix": [1, 4], "x": 72, "y": 16, "flags": 4}, + {"matrix": [1, 3], "x": 56, "y": 16, "flags": 4}, + {"matrix": [1, 2], "x": 40, "y": 16, "flags": 4}, + {"matrix": [1, 1], "x": 24, "y": 16, "flags": 4}, + {"matrix": [1, 0], "x": 4, "y": 16, "flags": 4}, + + {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4}, + {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4}, + {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4}, + {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4}, + {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4}, + {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4}, + {"matrix": [0, 6], "x": 96, "y": 0, "flags": 4}, + {"matrix": [0, 7], "x": 112, "y": 0, "flags": 4}, + {"matrix": [0, 8], "x": 128, "y": 0, "flags": 4}, + {"matrix": [0, 9], "x": 144, "y": 0, "flags": 4}, + {"matrix": [0, 10], "x": 160, "y": 0, "flags": 4}, + {"matrix": [0, 11], "x": 176, "y": 0, "flags": 4}, + {"matrix": [0, 12], "x": 192, "y": 0, "flags": 4}, + {"matrix": [0, 13], "x": 216, "y": 0, "flags": 4}, + {"matrix": [0, 14], "x": 240, "y": 0, "flags": 4} + ] + }, + "diode_direction": "COL2ROW", + "matrix_pins": { + "rows": ["GP4", "GP3", "GP2", "GP17", "GP15"], + "cols": ["GP28", "GP27", "GP29", "GP0", "GP1", "GP14", "GP13", "GP12", "GP11", "GP10", "GP9", "GP8", "GP7", "GP6", "GP5"] + }, + "url": "https://nulldesignco.com/", + "community_layouts": ["65_ansi"], + "layouts": { + "LAYOUT_65_ansi": { + "layout": [ + { "matrix": [0, 0], "x": 0, "y": 0 }, + { "matrix": [0, 1], "x": 1, "y": 0 }, + { "matrix": [0, 2], "x": 2, "y": 0 }, + { "matrix": [0, 3], "x": 3, "y": 0 }, + { "matrix": [0, 4], "x": 4, "y": 0 }, + { "matrix": [0, 5], "x": 5, "y": 0 }, + { "matrix": [0, 6], "x": 6, "y": 0 }, + { "matrix": [0, 7], "x": 7, "y": 0 }, + { "matrix": [0, 8], "x": 8, "y": 0 }, + { "matrix": [0, 9], "x": 9, "y": 0 }, + { "matrix": [0, 10], "x": 10, "y": 0 }, + { "matrix": [0, 11], "x": 11, "y": 0 }, + { "matrix": [0, 12], "x": 12, "y": 0 }, + { "matrix": [0, 13], "w": 2, "x": 13, "y": 0 }, + { "matrix": [0, 14], "x": 15, "y": 0 }, + { "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 }, + { "matrix": [1, 1], "x": 1.5, "y": 1 }, + { "matrix": [1, 2], "x": 2.5, "y": 1 }, + { "matrix": [1, 3], "x": 3.5, "y": 1 }, + { "matrix": [1, 4], "x": 4.5, "y": 1 }, + { "matrix": [1, 5], "x": 5.5, "y": 1 }, + { "matrix": [1, 6], "x": 6.5, "y": 1 }, + { "matrix": [1, 7], "x": 7.5, "y": 1 }, + { "matrix": [1, 8], "x": 8.5, "y": 1 }, + { "matrix": [1, 9], "x": 9.5, "y": 1 }, + { "matrix": [1, 10], "x": 10.5, "y": 1 }, + { "matrix": [1, 11], "x": 11.5, "y": 1 }, + { "matrix": [1, 12], "x": 12.5, "y": 1 }, + { "matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1 }, + { "matrix": [1, 14], "x": 15, "y": 1 }, + { "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 }, + { "matrix": [2, 1], "x": 1.75, "y": 2 }, + { "matrix": [2, 2], "x": 2.75, "y": 2 }, + { "matrix": [2, 3], "x": 3.75, "y": 2 }, + { "matrix": [2, 4], "x": 4.75, "y": 2 }, + { "matrix": [2, 5], "x": 5.75, "y": 2 }, + { "matrix": [2, 6], "x": 6.75, "y": 2 }, + { "matrix": [2, 7], "x": 7.75, "y": 2 }, + { "matrix": [2, 8], "x": 8.75, "y": 2 }, + { "matrix": [2, 9], "x": 9.75, "y": 2 }, + { "matrix": [2, 10], "x": 10.75, "y": 2 }, + { "matrix": [2, 11], "x": 11.75, "y": 2 }, + { "matrix": [2, 13], "w": 2.25, "x": 12.75, "y": 2 }, + { "matrix": [2, 14], "x": 15, "y": 2 }, + { "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 }, + { "matrix": [3, 1], "x": 2.25, "y": 3 }, + { "matrix": [3, 2], "x": 3.25, "y": 3 }, + { "matrix": [3, 3], "x": 4.25, "y": 3 }, + { "matrix": [3, 4], "x": 5.25, "y": 3 }, + { "matrix": [3, 5], "x": 6.25, "y": 3 }, + { "matrix": [3, 6], "x": 7.25, "y": 3 }, + { "matrix": [3, 7], "x": 8.25, "y": 3 }, + { "matrix": [3, 8], "x": 9.25, "y": 3 }, + { "matrix": [3, 9], "x": 10.25, "y": 3 }, + { "matrix": [3, 10], "x": 11.25, "y": 3 }, + { "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3 }, + { "matrix": [3, 13], "x": 14, "y": 3 }, + { "matrix": [3, 14], "x": 15, "y": 3 }, + { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 }, + { "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 }, + { "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 }, + { "matrix": [4, 5], "w": 6.25, "x": 3.75, "y": 4 }, + { "matrix": [4, 9], "x": 10, "y": 4 }, + { "matrix": [4, 10], "x": 11, "y": 4 }, + { "matrix": [4, 11], "x": 12, "y": 4 }, + { "matrix": [4, 12], "x": 13, "y": 4 }, + { "matrix": [4, 13], "x": 14, "y": 4 }, + { "matrix": [4, 14], "x": 15, "y": 4 } + ] + } + } +} diff --git a/keyboards/nulldesignco/null65ansi/v1/keymaps/default/keymap.c b/keyboards/nulldesignco/null65ansi/v1/keymaps/default/keymap.c new file mode 100755 index 00000000000..7a921cf608f --- /dev/null +++ b/keyboards/nulldesignco/null65ansi/v1/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +// Copyright 2025 quark-works +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_65_ansi( + QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; + +bool rgb_matrix_indicators_user(void) { + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color(24, 255, 0, 0); + } + return false; +} diff --git a/keyboards/nulldesignco/null65ansi/v1/readme.md b/keyboards/nulldesignco/null65ansi/v1/readme.md new file mode 100755 index 00000000000..308d4120e35 --- /dev/null +++ b/keyboards/nulldesignco/null65ansi/v1/readme.md @@ -0,0 +1,27 @@ +# null65ansi v1 + +![sp](https://i.imgur.com/zO7Jlwj.png) + +65% tray mount PCB with RGB per key. + +* Keyboard Maintainer: [Quark](https://github.com/quark-works) +* Hardware Supported: PCB +* Hardware Availability: https://nulldesignco.com/ + +Make example for this keyboard (after setting up your build environment): + + make nulldesignco/null65ansi/v1:default + +Flashing example for this keyboard: + + make nulldesignco/null65ansi/v1:default:flash + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Bootloader + +Enter the bootloader in 3 ways: + +* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard +* **Physical boot button**: Hold the button labeled as "BOOT" on the back of the board or short the two pads on the front while you connect the keyboard to your computer. +* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file